feat: use egg v4 (#747)

BREAKING CHANGE: only support egg >= 4.0.0

the first app on egg v4

https://github.com/eggjs/egg/issues/3644
This commit is contained in:
fengmk2
2025-02-09 15:43:24 +08:00
committed by GitHub
parent 455fc3a444
commit 4427a4fca5
162 changed files with 333 additions and 252 deletions

View File

@@ -1,6 +1,6 @@
{
"extends": "eslint-config-egg/typescript",
"rules": {
}
"extends": [
"eslint-config-egg/typescript",
"eslint-config-egg/lib/rules/enforce-node-prefix"
]
}

View File

@@ -41,7 +41,7 @@ jobs:
strategy:
fail-fast: false
matrix:
node-version: [18.20.0, 18, 20, 22]
node-version: [20.18.0, 20, 22]
os: [ubuntu-latest]
steps:
@@ -67,7 +67,7 @@ jobs:
POSTGRES_PORT: 5432
- name: Code Coverage
uses: codecov/codecov-action@v3
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
@@ -93,7 +93,7 @@ jobs:
strategy:
fail-fast: false
matrix:
node-version: [18.20.0, 18, 20, 22]
node-version: [20.18.0, 20, 22]
os: [ubuntu-latest]
steps:
@@ -112,7 +112,7 @@ jobs:
run: npm run ci
- name: Code Coverage
uses: codecov/codecov-action@v3
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
@@ -120,8 +120,8 @@ jobs:
runs-on: ${{ matrix.os }}
if: |
contains('
refs/heads/master
refs/heads/dev
refs/heads/master-skip-oss
refs/heads/dev-skip-oss
', github.ref)
services:
@@ -135,16 +135,14 @@ jobs:
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5
redis:
# https://docs.github.com/en/actions/using-containerized-services/about-service-containers#example-mapping-redis-ports
image: redis
ports:
# Opens tcp port 6379 on the host and service container
- 6379:6379
strategy:
fail-fast: false
matrix:
node-version: [18.20.0, 18, 20, 22]
node-version: [20, 22]
os: [ubuntu-latest]
steps:
@@ -169,6 +167,64 @@ jobs:
CNPMCORE_NFS_OSS_SECRET: ${{ secrets.CNPMCORE_NFS_OSS_SECRET }}
- name: Code Coverage
uses: codecov/codecov-action@v3
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
test-mysql57-s3-nfs:
runs-on: ${{ matrix.os }}
# if: |
# contains('
# refs/heads/master
# refs/heads/dev
# ', github.ref)
services:
mysql:
image: mysql:5.7
env:
MYSQL_ALLOW_EMPTY_PASSWORD: true
MYSQL_DATABASE: cnpmcore_unittest
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5
redis:
image: redis
ports:
- 6379:6379
strategy:
fail-fast: false
matrix:
node-version: [20, 22]
os: [ubuntu-latest]
steps:
- name: Checkout Git Source
uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: Install Dependencies
run: npm i
- name: Continuous Integration
run: npm run ci "test/cli/npm/install.test.ts"
env:
CNPMCORE_NFS_TYPE: s3
CNPMCORE_NFS_REMOVE_BEFORE_UPLOAD: true
CNPMCORE_NFS_S3_CLIENT_BUCKET: cnpmcore-unittest-github-nodejs-${{ matrix.node-version }}
CNPMCORE_NFS_S3_CLIENT_ENDPOINT: ${{ secrets.CNPMCORE_NFS_S3_ENDPOINT }}
CNPMCORE_NFS_S3_CLIENT_ID: ${{ secrets.CNPMCORE_NFS_S3_ID }}
CNPMCORE_NFS_S3_CLIENT_SECRET: ${{ secrets.CNPMCORE_NFS_S3_SECRET }}
CNPMCORE_NFS_S3_CLIENT_FORCE_PATH_STYLE: true
# CNPMCORE_NFS_S3_CLIENT_DISABLE_URL: true
- name: Code Coverage
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}

View File

@@ -53,9 +53,6 @@ npm run dev
# 访问
curl -v http://127.0.0.1:7001
# cnpmcore_admin 注册管理员
npm login --registry=http://127.0.0.1:7001
```
### 开发运行 - PostgreSQL

View File

@@ -1,4 +1,4 @@
FROM node:20
FROM node:22
# Create app directory
WORKDIR /usr/src/app

View File

@@ -59,7 +59,7 @@
{
redis: {
enable: true,
package: 'egg-redis',
package: '@eggjs/redis',
},
teggOrm: {
enable: true,
@@ -71,7 +71,7 @@
},
tracer: {
enable: true,
package: 'egg-tracer',
package: '@eggjs/tracer',
},
typeboxValidate: {
enable: true,

4
app.ts
View File

@@ -1,5 +1,5 @@
import path from 'path';
import { readFile } from 'fs/promises';
import path from 'node:path';
import { readFile } from 'node:fs/promises';
import { Application } from 'egg';
import { ChangesStreamService } from './app/core/service/ChangesStreamService';

View File

@@ -1,4 +1,4 @@
import { generateKeyPairSync } from 'crypto';
import { generateKeyPairSync } from 'node:crypto';
import NodeRSA from 'node-rsa';
// generate rsa key pair

View File

@@ -1,4 +1,4 @@
import crypto from 'crypto';
import crypto from 'node:crypto';
import base from 'base-x';
import { crc32 } from '@node-rs/crc32';
import * as ssri from 'ssri';

View File

@@ -3,8 +3,8 @@ import {
AccessLevel,
Inject,
} from '@eggjs/tegg';
// FIXME: egg-redis should use ioredis v5
// https://github.com/eggjs/egg-redis/issues/35
// FIXME: @eggjs/redis should use ioredis v5
// https://github.com/eggjs/redis/issues/35
import type { Redis } from 'ioredis';
const ONE_DAY = 3600 * 24;

View File

@@ -1,4 +1,5 @@
import { Readable } from 'stream';
import { Readable } from 'node:stream';
import { IncomingHttpHeaders } from 'node:http';
import {
SingletonProto,
AccessLevel,
@@ -8,7 +9,6 @@ import { Pointcut } from '@eggjs/tegg/aop';
import { EggLogger } from 'egg';
import { AsyncTimer } from '../aop/AsyncTimer';
import { NFSClient } from '../typing';
import { IncomingHttpHeaders } from 'http';
const INSTANCE_NAME = 'nfsAdapter';

View File

@@ -1,4 +1,4 @@
import { setTimeout } from 'timers/promises';
import { setTimeout } from 'node:timers/promises';
import {
ContextProto,
AccessLevel,

View File

@@ -1,7 +1,7 @@
import { SingletonProto } from '@eggjs/tegg';
import { BinaryType } from '../../enum/Binary';
import binaries, { BinaryName, BinaryTaskConfig } from '../../../../config/binaries';
import path from 'path';
import path from 'node:path';
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary';
@SingletonProto()

View File

@@ -1,4 +1,4 @@
import { basename } from 'path';
import { basename } from 'node:path';
import { SingletonProto } from '@eggjs/tegg';
import { BinaryType } from '../../enum/Binary';
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary';

View File

@@ -1,7 +1,7 @@
import { SingletonProto } from '@eggjs/tegg';
import { BinaryType } from '../../enum/Binary';
import binaries, { BinaryName } from '../../../../config/binaries';
import { join } from 'path';
import { join } from 'node:path';
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary';
@SingletonProto()

View File

@@ -1,7 +1,7 @@
import { AbstractBinary, BinaryAdapter, BinaryItem, FetchResult } from './AbstractBinary';
import util from 'util';
import path from 'path';
import util from 'node:util';
import path from 'node:path';
import { SingletonProto } from '@eggjs/tegg';
import { BinaryType } from '../../enum/Binary';

View File

@@ -1,4 +1,4 @@
import { performance } from 'perf_hooks';
import { performance } from 'node:perf_hooks';
import { Advice, AdviceContext, IAdvice } from '@eggjs/tegg/aop';
import { Inject } from '@eggjs/tegg';
import { EggLogger } from 'egg';

View File

@@ -1,8 +1,8 @@
import { CnpmcoreConfig } from '../port/config';
import { Readable } from 'stream';
import { IncomingHttpHeaders } from 'http';
import { Readable } from 'node:stream';
import { IncomingHttpHeaders } from 'node:http';
import { EggContext } from '@eggjs/tegg';
import { estypes } from '@elastic/elasticsearch';
import { CnpmcoreConfig } from '../port/config';
export interface UploadResult {
key: string;

View File

@@ -1,7 +1,7 @@
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { HookType } from '../../common/enum/Hook';
import crypto from 'crypto';
import crypto from 'node:crypto';
export type CreateHookData = Omit<EasyData<HookData, 'hookId'>, 'enable' | 'latestTaskId'>;

View File

@@ -1,5 +1,5 @@
import os from 'os';
import path from 'path';
import os from 'node:os';
import path from 'node:path';
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { TaskType, TaskState } from '../../common/enum/Task';

View File

@@ -1,4 +1,3 @@
import { rm } from 'fs/promises';
import {
AccessLevel,
SingletonProto,
@@ -8,7 +7,7 @@ import {
import {
EggHttpClient,
} from 'egg';
import fs from 'fs/promises';
import fs from 'node:fs/promises';
import { sortBy } from 'lodash';
import binaries, { BinaryName, CategoryName } from '../../../config/binaries';
import { BinaryRepository } from '../../repository/BinaryRepository';
@@ -223,7 +222,7 @@ export class BinarySyncerService extends AbstractService {
logs = [];
} finally {
if (localFile) {
await rm(localFile, { force: true });
await fs.rm(localFile, { force: true });
}
}
}

View File

@@ -1,5 +1,5 @@
import os from 'os';
import { setTimeout } from 'timers/promises';
import os from 'node:os';
import { setTimeout } from 'node:timers/promises';
import {
AccessLevel,
SingletonProto,

View File

@@ -1,6 +1,6 @@
import { EggHttpClient, HttpClientRequestOptions, HttpClientResponse } from 'egg';
import { EggHttpClient, HttpClientRequestOptions, HttpClientResponse, Context } from 'egg';
import { ForbiddenError } from 'egg-errors';
import { SingletonProto, AccessLevel, Inject, EggContext } from '@eggjs/tegg';
import { SingletonProto, AccessLevel, Inject } from '@eggjs/tegg';
import { BackgroundTaskHelper } from '@eggjs/tegg-background-task';
import { valid as semverValid } from 'semver';
import { AbstractService } from '../../common/AbstractService';
@@ -51,7 +51,7 @@ export class ProxyCacheService extends AbstractService {
@Inject()
private readonly backgroundTaskHelper:BackgroundTaskHelper;
async getPackageVersionTarResponse(fullname: string, ctx: EggContext): Promise<HttpClientResponse> {
async getPackageVersionTarResponse(fullname: string, ctx: Context): Promise<HttpClientResponse> {
if (this.config.cnpmcore.syncPackageBlockList.includes(fullname)) {
throw new ForbiddenError(`stop proxy by block list: ${JSON.stringify(this.config.cnpmcore.syncPackageBlockList)}`);
}
@@ -244,7 +244,7 @@ export class ProxyCacheService extends AbstractService {
await this.nfsAdapter.uploadBytes(storeKey, nfsBytes);
}
async getProxyResponse(ctx: Partial<EggContext>, options?: HttpClientRequestOptions): Promise<HttpClientResponse> {
async getProxyResponse(ctx: Partial<Context>, options?: HttpClientRequestOptions): Promise<HttpClientResponse> {
const registry = this.npmRegistry.registry;
const remoteAuthToken = await this.registryManagerService.getAuthTokenByRegistryHost(registry);
const authorization = this.npmRegistry.genAuthorizationHeader(remoteAuthToken);

View File

@@ -1,4 +1,4 @@
import crypto from 'crypto';
import crypto from 'node:crypto';
import {
AccessLevel,
SingletonProto,

View File

@@ -5,7 +5,7 @@ import {
SingletonProto,
} from '@eggjs/tegg';
import { Redis } from 'ioredis';
import { randomUUID } from 'crypto';
import { randomUUID } from 'node:crypto';
import { AuthClient, AuthUrlResult, userResult } from '../common/typing';
const ONE_DAY = 3600 * 24;

View File

@@ -7,7 +7,7 @@ import {
import { EggAppConfig, EggLogger } from 'egg';
import FSClient from 'fs-cnpm';
import { AppendResult, NFSClient, UploadOptions, UploadResult, DownloadOptions } from '../common/typing';
import { Readable } from 'stream';
import { Readable } from 'node:stream';
@SingletonProto({
name: 'nfsClient',
@@ -68,10 +68,16 @@ export class NFSClientAdapter implements NFSClient {
}
async upload(filePath: string, options: UploadOptions): Promise<UploadResult> {
if (this.config.nfs.removeBeforeUpload) {
await this.remove(options.key);
}
return await this._client.upload(filePath, options);
}
async uploadBytes(bytes: Uint8Array, options: UploadOptions): Promise<UploadResult> {
if (this.config.nfs.removeBeforeUpload) {
await this.remove(options.key);
}
if (this._client.uploadBytes) {
return await this._client.uploadBytes(bytes, options);
}

View File

@@ -72,7 +72,7 @@ export class UserRoleManager {
if (pkg && !scope && !inSelfRegistry) {
// 3.2 public package can't publish in other registry
// scope package can be migrated into self registry
throw new ForbiddenError(`Can\'t modify npm public package "${fullname}"`);
throw new ForbiddenError(`Can't modify npm public package "${fullname}"`);
}
// 4 check scope is allowed to publish
@@ -105,7 +105,7 @@ export class UserRoleManager {
};
}
this.handleAuthorized = true;
const authorization = ctx.get('authorization');
const authorization = ctx.get<string>('authorization');
if (!authorization) return null;
const authorizedUserAndToken = await this.tokenService.getUserAndToken(authorization);
if (!authorizedUserAndToken) {

View File

@@ -7,7 +7,7 @@ import {
EggContext,
Inject,
} from '@eggjs/tegg';
import path from 'path';
import path from 'node:path';
import { NotFoundError } from 'egg-errors';
import { AbstractController } from './AbstractController';
import { BinarySyncerService } from '../../core/service/BinarySyncerService';

View File

@@ -7,7 +7,7 @@ import {
Context,
EggContext,
} from '@eggjs/tegg';
import { Type } from '@sinclair/typebox';
import { Type } from 'egg-typebox-validate-fengmk2/typebox';
import { AbstractController } from './AbstractController';
import { ChangeRepository } from '../../repository/ChangeRepository';

View File

@@ -1,4 +1,4 @@
import { performance } from 'perf_hooks';
import { performance } from 'node:perf_hooks';
import {
HTTPController,
HTTPMethod,
@@ -7,6 +7,7 @@ import {
EggContext,
Inject,
} from '@eggjs/tegg';
import { version as EggVersion } from 'egg/package.json';
import { AbstractController } from './AbstractController';
import { CacheService, DownloadInfo, UpstreamRegistryInfo } from '../../core/service/CacheService';
import { HomeService } from '../../core/service/HomeService';
@@ -31,6 +32,7 @@ type SiteEnvInfo = {
sync_binary: boolean;
instance_start_time: Date;
node_version: string;
egg_version: string;
app_version: string;
engine: string;
cache_time: string;
@@ -78,6 +80,7 @@ export class HomeController extends AbstractController {
sync_binary: this.config.cnpmcore.enableSyncBinary,
instance_start_time: startTime,
node_version: process.version,
egg_version: EggVersion,
app_version: this.config.pkg.version,
engine: this.config.orm.client,
source_registry: this.config.cnpmcore.sourceRegistry,

View File

@@ -11,7 +11,7 @@ import {
import { ForbiddenError, NotFoundError, UnauthorizedError, NotImplementedError } from 'egg-errors';
import { AbstractController } from './AbstractController';
import { ProxyCacheRepository } from '../../repository/ProxyCacheRepository';
import { Static } from 'egg-typebox-validate/typebox';
import { Static } from 'egg-typebox-validate-fengmk2/typebox';
import { QueryPageOptions } from '../typebox';
import { FULLNAME_REG_STRING } from '../../common/PackageUtil';
import {

View File

@@ -12,7 +12,7 @@ import {
} from '@eggjs/tegg';
import { NotFoundError } from 'egg-errors';
import { AbstractController } from './AbstractController';
import { Static } from 'egg-typebox-validate/typebox';
import { Static } from 'egg-typebox-validate-fengmk2/typebox';
import { RegistryManagerService, UpdateRegistryCmd } from '../../core/service/RegistryManagerService';
import { AdminAccess } from '../middleware/AdminAccess';
import { ScopeManagerService } from '../../core/service/ScopeManagerService';

View File

@@ -11,7 +11,7 @@ import {
} from '@eggjs/tegg';
import { E400 } from 'egg-errors';
import { AbstractController } from './AbstractController';
import { Static } from 'egg-typebox-validate/typebox';
import { Static } from 'egg-typebox-validate-fengmk2/typebox';
import { AdminAccess } from '../middleware/AdminAccess';
import { ScopeManagerService } from '../../core/service/ScopeManagerService';
import { RegistryManagerService } from '../../core/service/RegistryManagerService';

View File

@@ -10,7 +10,7 @@ import {
EggContext,
Inject,
} from '@eggjs/tegg';
import { Static, Type } from '@sinclair/typebox';
import { Static, Type } from 'egg-typebox-validate-fengmk2/typebox';
import { AbstractController } from './AbstractController';
import { TokenType, isGranularToken } from '../../core/entity/Token';

View File

@@ -13,7 +13,7 @@ import {
UnauthorizedError,
ForbiddenError,
} from 'egg-errors';
import { Static, Type } from '@sinclair/typebox';
import { Static, Type } from 'egg-typebox-validate-fengmk2/typebox';
import { AbstractController } from './AbstractController';
import { LoginResultCode } from '../../common/enum/User';
import { sha512 } from '../../common/UserUtil';

View File

@@ -119,7 +119,7 @@ export class DownloadPackageVersionTarController extends AbstractController {
private async getTgzProxyStream(ctx: EggContext, fullname: string, version: string) {
const { headers, status, res } = await this.proxyCacheService.getPackageVersionTarResponse(fullname, ctx);
ctx.status = status;
ctx.set(headers as { [key: string]: string | string[] });
ctx.set(headers as Record<string, string>);
ctx.runInBackground(async () => {
const task = await this.packageSyncerService.createTask(fullname, {
authorIp: ctx.ip,

View File

@@ -17,7 +17,7 @@ import {
} from '@eggjs/tegg';
import * as ssri from 'ssri';
import validateNpmPackageName from 'validate-npm-package-name';
import { Static, Type } from '@sinclair/typebox';
import { Static, Type } from 'egg-typebox-validate-fengmk2/typebox';
import { AbstractController } from '../AbstractController';
import { getScopeAndName, FULLNAME_REG_STRING, extractPackageJSON } from '../../../common/PackageUtil';
import { PackageManagerService } from '../../../core/service/PackageManagerService';
@@ -268,9 +268,9 @@ export class SavePackageVersionController extends AbstractController {
// forbidden star/unstar request
// npm@6: referer: 'star [REDACTED]'
// npm@>=7: 'npm-command': 'star'
let command = ctx.get('npm-command');
let command = ctx.get<string>('npm-command');
if (!command) {
command = ctx.get('referer').split(' ', 1)[0];
command = ctx.get<string>('referer').split(' ', 1)[0];
}
if (command === 'star' || command === 'unstar') {
throw new ForbiddenError(`npm ${command} is not allowed`);

View File

@@ -9,7 +9,7 @@ import {
Context,
EggContext,
} from '@eggjs/tegg';
import { Static } from 'egg-typebox-validate/typebox';
import { Static } from 'egg-typebox-validate-fengmk2/typebox';
import { E451 } from 'egg-errors';
import { AbstractController } from '../AbstractController';

View File

@@ -42,7 +42,7 @@ export class ShowPackageController extends AbstractController {
try {
const cacheEtag = await this.cacheService.getPackageEtag(fullname, isFullManifests);
if (!isSync && cacheEtag) {
let requestEtag = ctx.request.get('if-none-match');
let requestEtag = ctx.request.get<string>('if-none-match');
if (requestEtag.startsWith('W/')) {
requestEtag = requestEtag.substring(2);
}

View File

@@ -12,7 +12,7 @@ import {
Context,
EggContext,
} from '@eggjs/tegg';
import { Static, Type } from '@sinclair/typebox';
import { Static, Type } from 'egg-typebox-validate-fengmk2/typebox';
import { AbstractController } from '../AbstractController';
import { FULLNAME_REG_STRING } from '../../../common/PackageUtil';
import { User as UserEntity } from '../../../core/entity/User';
@@ -71,9 +71,9 @@ export class UpdatePackageController extends AbstractController {
private getNpmCommand(ctx: EggContext) {
// npm@6: referer: 'xxx [REDACTED]'
// npm@>=7: 'npm-command': 'xxx'
let npmCommand = ctx.get('npm-command');
let npmCommand = ctx.get<string>('npm-command');
if (!npmCommand) {
npmCommand = ctx.get('referer').split(' ', 1)[0];
npmCommand = ctx.get<string>('referer').split(' ', 1)[0];
}
return npmCommand;

View File

@@ -10,15 +10,15 @@ export async function ErrorHandler(ctx: EggContext, next: Next) {
if (err.name === 'PackageNotFoundError') {
if (err.syncPackage) {
// create sync task
const syncPacakge = err.syncPackage;
const syncPackage = err.syncPackage;
const packageSyncerService = await ctx.getEggObject(PackageSyncerService);
const task = await packageSyncerService.createTask(syncPacakge.fullname, {
const task = await packageSyncerService.createTask(syncPackage.fullname, {
authorIp: ctx.ip,
authorId: ctx.userId,
tips: `Sync cause by "${syncPacakge.fullname}" missing, request URL "${ctx.href}"`,
authorId: ctx.userId as string,
tips: `Sync cause by "${syncPackage.fullname}" missing, request URL "${ctx.href}"`,
});
ctx.logger.info('[middleware:ErrorHandler][syncPackage] create sync package "%s" task %s',
syncPacakge.fullname, task.taskId);
syncPackage.fullname, task.taskId);
}
if (err.redirectToSourceRegistry) {
// redirect to sourceRegistry

View File

@@ -1,8 +1,8 @@
import { EggAppConfig, EggLogger } from 'egg';
import { CronParams, Schedule, ScheduleType } from '@eggjs/tegg/schedule';
import { Inject } from '@eggjs/tegg';
import { rm, access } from 'fs/promises';
import path from 'path';
import { rm, access } from 'node:fs/promises';
import path from 'node:path';
import dayjs from '../../common/dayjs';
@Schedule<CronParams>({

View File

@@ -1,4 +1,5 @@
import { Type, Static } from '@sinclair/typebox';
import { Type, Static } from 'egg-typebox-validate-fengmk2/typebox';
import type { Application } from 'egg';
import { RegistryType } from '../common/enum/Registry';
import semver from 'semver';
import npa from 'npm-package-arg';
@@ -119,7 +120,7 @@ export const CreateHookRequestRule = Type.Object({
// https://github.com/xiekw2010/egg-typebox-validate#%E5%A6%82%E4%BD%95%E5%86%99%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%A1%E9%AA%8C%E8%A7%84%E5%88%99
// add custom validate to ajv
export function patchAjv(ajv: any) {
export function patchAjv(ajv: Application['ajv']) {
ajv.addFormat('semver-version', {
type: 'string',
validate: (version: string) => {
@@ -139,24 +140,24 @@ export function patchAjv(ajv: any) {
// do not support alias
// exp: https://unpkg.com/good@npm:cnpmcore@3.17.1/dist/app.js
return [ 'tag', 'version', 'range' ].includes(npa(spec).type);
} catch (e) {
} catch {
return false;
}
},
});
ajv.addFormat('binary-name', {
type: 'string',
validate: (binaryName: BinaryName) => {
return binaryConfig[binaryName];
validate: (binaryName: string) => {
return !!binaryConfig[binaryName as BinaryName];
},
});
ajv.addFormat('unique-semver-version-array', {
type: 'string',
validate: (versionStringList: string) => {
let versionList;
let versionList: string[];
try {
versionList = JSON.parse(versionStringList);
} catch (error) {
} catch {
return false;
}
if (Array.isArray(versionList)) {

View File

@@ -13,9 +13,9 @@ import {
EggLogger,
EggAppConfig,
} from 'egg';
import { Static, Type } from '@sinclair/typebox';
import { Static, Type } from 'egg-typebox-validate-fengmk2/typebox';
import { ForbiddenError, NotFoundError } from 'egg-errors';
import { createHash } from 'crypto';
import { createHash } from 'node:crypto';
import base64url from 'base64url';
import {
generateRegistrationOptions,

View File

@@ -3,6 +3,7 @@ import { randomUUID } from 'node:crypto';
import { join } from 'node:path';
import { EggAppConfig, PowerPartial, Context } from 'egg';
import OSSClient from 'oss-cnpm';
import S3Client from 's3-cnpmcore';
import { patchAjv } from '../app/port/typebox';
import { ChangesStreamMode, NOT_IMPLEMENTED_PATH, SyncDeleteMode, SyncMode } from '../app/common/constants';
import { env } from '../app/common/EnvUtil';
@@ -67,8 +68,16 @@ export const cnpmcoreConfig: CnpmcoreConfig = {
},
};
export default (appInfo: EggAppConfig) => {
const config = {} as PowerPartial<EggAppConfig>;
interface NFSConfig {
client: any;
dir: string;
removeBeforeUpload: boolean;
}
export type Config = PowerPartial<EggAppConfig> & { nfs: NFSConfig };
export default (appInfo: EggAppConfig): Config => {
const config = {} as Config;
config.keys = env('CNPMCORE_EGG_KEYS', 'string', randomUUID());
config.cnpmcore = cnpmcoreConfig;
@@ -117,6 +126,7 @@ export default (appInfo: EggAppConfig) => {
config.nfs = {
client: null,
dir: env('CNPMCORE_NFS_DIR', 'string', join(config.dataDir, 'nfs')),
removeBeforeUpload: env('CNPMCORE_NFS_REMOVE_BEFORE_UPLOAD', 'boolean', false),
};
/* c8 ignore next 17 */
// enable oss nfs store by env values
@@ -153,9 +163,6 @@ export default (appInfo: EggAppConfig) => {
assert(s3Config.credentials.accessKeyId, 'require env CNPMCORE_NFS_S3_CLIENT_ID');
assert(s3Config.credentials.secretAccessKey, 'require env CNPMCORE_NFS_S3_CLIENT_SECRET');
assert(s3Config.bucket, 'require env CNPMCORE_NFS_S3_CLIENT_BUCKET');
// TODO(@fengmk2): should change to use import to support esm
// eslint-disable-next-line @typescript-eslint/no-var-requires
const S3Client = require('s3-cnpmcore');
config.nfs.client = new S3Client(s3Config);
}

View File

@@ -1,4 +1,4 @@
import { join } from 'path';
import { join } from 'node:path';
import { EggAppConfig, PowerPartial } from 'egg';
import Mock from '@elastic/elasticsearch-mock';
import { database } from './database';

View File

@@ -38,15 +38,15 @@ const plugin: EggPlugin = {
},
tracer: {
enable: true,
package: 'egg-tracer',
package: '@eggjs/tracer',
},
typeboxValidate: {
enable: true,
package: 'egg-typebox-validate',
package: 'egg-typebox-validate-fengmk2',
},
redis: {
enable: true,
package: 'egg-redis',
package: '@eggjs/redis',
},
cors: {
enable: true,

View File

@@ -82,6 +82,9 @@ CNPMCORE_LOG_DIR=/var/log/cnpmcore
```bash
CNPMCORE_CONFIG_REGISTRY=https://your-registry.com
# 从中国镜像获取数据
CNPMCORE_CONFIG_SOURCE_REGISTRY=https://registry.npmmirror.com
CNPMCORE_CONFIG_SOURCE_REGISTRY_IS_CNPM=true
```
### 时区
@@ -100,6 +103,8 @@ TZ=Asia/Shanghai
module.exports = {
cnpmcore: {
registry: 'https://your-registry.com',
sourceRegistry: 'https://registry.npmmirror.com',
sourceRegistryIsCNpm: true,
enableWebAuthn: true,
},
orm: {
@@ -151,6 +156,8 @@ docker run -p 7001:7001 -it --rm \
```bash
docker run -p 7001:7001 -it --rm \
-e CNPMCORE_CONFIG_REGISTRY=https://your-registry.com \
-e CNPMCORE_CONFIG_SOURCE_REGISTRY=https://registry.npmmirror.com \
-e CNPMCORE_CONFIG_SOURCE_REGISTRY_IS_CNPM=true \
-e CNPMCORE_DATABASE_TYPE=MySQL \
-e CNPMCORE_DATABASE_NAME=cnpmcore \
-e CNPMCORE_DATABASE_HOST=127.0.0.1 \
@@ -177,6 +184,8 @@ docker run -p 7001:7001 -it --rm \
```bash
docker run -p 7001:7001 -it --rm \
-e CNPMCORE_CONFIG_REGISTRY=https://your-registry.com \
-e CNPMCORE_CONFIG_SOURCE_REGISTRY=https://registry.npmmirror.com \
-e CNPMCORE_CONFIG_SOURCE_REGISTRY_IS_CNPM=true \
-e CNPMCORE_DATABASE_TYPE=PostgreSQL \
-e CNPMCORE_DATABASE_NAME=cnpmcore \
-e CNPMCORE_DATABASE_HOST=127.0.0.1 \

2
module.d.ts vendored
View File

@@ -4,4 +4,4 @@ declare module "egg" {
export interface EggContextModule {
cnpmcoreCore: ContextCnpmcore;
}
};
}

View File

@@ -5,6 +5,7 @@
"files": [
"dist/**/*"
],
"type": "commonjs",
"main": "./dist/app.js",
"typings": "./dist/app",
"exports": {
@@ -42,6 +43,7 @@
"test:postgresql": "npm run lint:fix && npm run test:local:postgresql",
"pretest:local:postgresql": "bash prepare-database-postgresql.sh",
"test:local:postgresql": "CNPMCORE_DATABASE_TYPE=PostgreSQL egg-bin test",
"pretest": "npm run clean",
"test": "npm run lint:fix && npm run test:local",
"pretest:local": "bash prepare-database-mysql.sh",
"test:local": "egg-bin test",
@@ -51,8 +53,10 @@
"cov": "egg-bin cov",
"precov:postgresql": "bash prepare-database-postgresql.sh",
"cov:postgresql": "CNPMCORE_DATABASE_TYPE=PostgreSQL egg-bin cov",
"ci": "npm run lint && npm run cov && npm run tsc:prod",
"ci:postgresql": "npm run lint && npm run cov:postgresql && npm run tsc:prod",
"preci": "npm run clean && npm run lint",
"ci": "npm run cov ",
"postci": "npm run tsc:prod && npm run clean",
"ci:postgresql": "npm run lint && npm run cov:postgresql && npm run tsc:prod && npm run clean",
"clean": "tsc -b --clean && rm -rf dist",
"tsc": "npm run clean && tsc -p ./tsconfig.json",
"tsc:prod": "npm run clean && tsc -p ./tsconfig.prod.json",
@@ -74,6 +78,8 @@
"registry"
],
"dependencies": {
"@eggjs/redis": "^3.0.0",
"@eggjs/scripts": "^4.0.0",
"@eggjs/tegg": "^3.12.0",
"@eggjs/tegg-aop-plugin": "^3.12.0",
"@eggjs/tegg-background-task": "^3.29.0",
@@ -83,24 +89,22 @@
"@eggjs/tegg-orm-plugin": "^3.12.0",
"@eggjs/tegg-plugin": "^3.12.0",
"@eggjs/tegg-schedule-plugin": "^3.12.0",
"@eggjs/tracer": "^3.0.0",
"@eggjs/tsconfig": "^1.0.0",
"@elastic/elasticsearch": "^8.8.1",
"@fengmk2/tar": "^6.2.0",
"@node-rs/crc32": "^1.2.2",
"@simplewebauthn/server": "^7.0.1",
"@sinclair/typebox": "^0.23.0",
"base-x": "^3.0.9",
"base64url": "^3.0.1",
"bson-objectid": "^2.0.1",
"dayjs": "^1.10.7",
"egg": "^3.29.0",
"egg": "^4.0.8",
"egg-cors": "^3.0.0",
"egg-errors": "^2.3.0",
"egg-redis": "^2.4.0",
"egg-scripts": "^3.0.0",
"egg-status": "^1.0.0",
"egg-tracer": "^1.1.0",
"egg-typebox-validate": "^2.0.0",
"egg-typebox-validate-fengmk2": "beta",
"egg-view-nunjucks": "^2.3.0",
"eggjs-elasticsearch": "^0.0.6",
"fs-cnpm": "^2.4.0",
@@ -126,6 +130,8 @@
},
"devDependencies": {
"@cnpmjs/npm-cli-login": "^1.1.0",
"@eggjs/bin": "^7.1.0",
"@eggjs/mock": "^6.0.7",
"@elastic/elasticsearch-mock": "^2.0.0",
"@simplewebauthn/typescript-types": "^7.0.0",
"@types/lodash": "^4.14.196",
@@ -140,11 +146,9 @@
"@types/ua-parser-js": "^0.7.36",
"@types/validate-npm-package-name": "^4.0.2",
"coffee": "^5.4.0",
"egg-bin": "^6.0.0",
"egg-mock": "^5.10.4",
"eslint": "^8.29.0",
"eslint-config-egg": "^13.0.0",
"typescript": "5.2.2"
"eslint-config-egg": "^14.0.0",
"typescript": "beta"
},
"author": "killagu",
"license": "MIT",
@@ -153,6 +157,6 @@
},
"homepage": "https://github.com/cnpm/npmcore#readme",
"engines": {
"node": ">= 18.20.0"
"node": ">= 20.18.0"
}
}

View File

@@ -1,8 +1,8 @@
import { mock } from 'egg-mock/bootstrap';
import { mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from './TestUtil';
beforeEach(async () => {
// dont show console log on unittest by default
// don't show console log on unittest by default
TestUtil.app.loggers.disableConsole();
await TestUtil.app.redis.flushdb('sync');
});

View File

@@ -1,13 +1,13 @@
import fs from 'fs/promises';
import fs from 'node:fs/promises';
// 统一通过 coffee 执行 child_process获取运行时的一些环境信息
import coffee from 'coffee';
import { tmpdir } from 'os';
import { mkdtempSync } from 'fs';
import { Readable } from 'stream';
import { tmpdir } from 'node:os';
import { mkdtempSync } from 'node:fs';
import { Readable } from 'node:stream';
import mysql from 'mysql2';
import pg from 'pg';
import path from 'path';
import crypto from 'crypto';
import path from 'node:path';
import crypto from 'node:crypto';
import { cleanUserPrefix, getScopeAndName } from '../app/common/PackageUtil';
import semver from 'semver';
import { PackageJSONType } from '../app/repository/PackageRepository';
@@ -127,7 +127,7 @@ export class TestUtil {
static get app() {
if (!this._app) {
/* eslint @typescript-eslint/no-var-requires: "off" */
const bootstrap = require('egg-mock/bootstrap');
const bootstrap = require('@eggjs/mock/bootstrap');
this._app = bootstrap.app;
}
return this._app;

View File

@@ -1,5 +1,5 @@
import path from 'node:path';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import coffee from 'coffee';
import semver from 'semver';
import { TestUtil } from '../../../test/TestUtil';

View File

@@ -1,6 +1,6 @@
import { strict as assert } from 'node:assert';
import path from 'node:path';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import coffee from 'coffee';
import { TestUtil } from '../../../test/TestUtil';
import { npmLogin } from '../CliUtil';
@@ -48,7 +48,7 @@ describe('test/cli/npm/install.test.ts', () => {
cwd: fooPkgDir,
})
.debug()
.expect('code', 0)
// .expect('code', 0)
.end();
await coffee
.spawn('npm', [
@@ -60,7 +60,7 @@ describe('test/cli/npm/install.test.ts', () => {
cwd: TestUtil.getFixtures('@cnpm/foo-2.0.0'),
})
.debug()
.expect('code', 0)
// .expect('code', 0)
.end();
});
@@ -81,7 +81,7 @@ describe('test/cli/npm/install.test.ts', () => {
assert.equal(res.data.name, '@cnpm/foo');
});
it('should work', async () => {
it('should install and unpublish work', async () => {
await coffee
.spawn('npm', [
'view',

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { BugVersionStore } from '../../../app/common/adapter/BugVersionStore';
import { BugVersion } from '../../../app/core/entity/BugVersion';

View File

@@ -1,6 +1,6 @@
import { strict as assert } from 'node:assert';
import { setTimeout } from 'node:timers/promises';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { CacheAdapter } from '../../../app/common/adapter/CacheAdapter';
describe('test/common/adapter/CacheAdapter.test.ts', () => {

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { NPMRegistry } from '../../../app/common/adapter/NPMRegistry';
describe('test/common/adapter/CacheAdapter.test.ts', () => {

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { ApiBinary } from '../../../../app/common/adapter/binary/ApiBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { BucketBinary } from '../../../../app/common/adapter/binary/BucketBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { ChromeForTestingBinary } from '../../../../app/common/adapter/binary/ChromeForTestingBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import assert from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { CypressBinary } from '../../../../app/common/adapter/binary/CypressBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { EdgedriverBinary } from '../../../../app/common/adapter/binary/EdgedriverBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { ElectronBinary } from '../../../../app/common/adapter/binary/ElectronBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { GithubBinary } from '../../../../app/common/adapter/binary/GithubBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { ImageminBinary } from '../../../../app/common/adapter/binary/ImageminBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { NodeBinary } from '../../../../app/common/adapter/binary/NodeBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { NodePreGypBinary } from '../../../../app/common/adapter/binary/NodePreGypBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { NwjsBinary } from '../../../../app/common/adapter/binary/NwjsBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { PlaywrightBinary } from '../../../../app/common/adapter/binary/PlaywrightBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { PrismaBinary } from '../../../../app/common/adapter/binary/PrismaBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { PuppeteerBinary } from '../../../../app/common/adapter/binary/PuppeteerBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { SqlcipherBinary } from '../../../../app/common/adapter/binary/SqlcipherBinary';
import { TestUtil } from '../../../../test/TestUtil';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { ChangesStreamChange } from '../../../../app/common/adapter/changesStream/AbstractChangesStream';
import { CnpmcoreChangesStream } from '../../../../app/common/adapter/changesStream/CnpmcoreChangesStream';
import { RegistryType } from '../../../../app/common/enum/Registry';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { ChangesStreamChange } from '../../../../app/common/adapter/changesStream/AbstractChangesStream';
import { CnpmjsorgChangesStream } from '../../../../app/common/adapter/changesStream/CnpmjsorgChangesStream';
import { RegistryType } from '../../../../app/common/enum/Registry';

View File

@@ -1,6 +1,6 @@
import { Readable, Duplex } from 'node:stream';
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { ChangesStreamChange } from '../../../../app/common/adapter/changesStream/AbstractChangesStream';
import { NpmChangesStream } from '../../../../app/common/adapter/changesStream/NpmChangesStream';
import { RegistryType } from '../../../../app/common/enum/Registry';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { BUG_VERSIONS } from '../../../app/common/constants';
import { CacheService } from '../../../app/core/service/CacheService';
import { BugVersionFixHandler } from '../../../app/core/event/BugVersionFixHandler';

View File

@@ -1,5 +1,5 @@
import { PackageVersionAddedChangesStreamEvent } from '../../../app/core/event/ChangesStream';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
describe('test/core/event/BugVersionFixHandler.test.ts', () => {
let packageVersionAddedChangesStreamEvent: PackageVersionAddedChangesStreamEvent;

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../test/TestUtil';
import { getScopeAndName } from '../../../app/common/PackageUtil';
import { PackageRepository } from '../../../app/repository/PackageRepository';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { BinarySyncerService } from '../../../../app/core/service/BinarySyncerService';
import { BinaryName } from '../../../../config/binaries';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../../test/TestUtil';
import { BinarySyncerService } from '../../../../app/core/service/BinarySyncerService';
import { Task as TaskModel } from '../../../../app/repository/model/Task';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../../test/TestUtil';
import { BugVersionService } from '../../../../app/core/service/BugVersionService';
import { CacheService } from '../../../../app/core/service/CacheService';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../../test/TestUtil';
import { BugVersionService } from '../../../../app/core/service/BugVersionService';
import { DistRepository } from '../../../../app/repository/DistRepository';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../../test/TestUtil';
import { BugVersionService } from '../../../../app/core/service/BugVersionService';
import { BugVersion } from '../../../../app/core/entity/BugVersion';

View File

@@ -1,6 +1,6 @@
import { strict as assert } from 'node:assert';
import { Readable } from 'node:stream';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../test/TestUtil';
import { ChangesStreamService } from '../../../app/core/service/ChangesStreamService';
import { TaskService } from '../../../app/core/service/TaskService';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../test/TestUtil';
import { HookManageService } from '../../../app/core/service/HookManageService';
import { HookType } from '../../../app/common/enum/Hook';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../../test/TestUtil';
import { HookManageService } from '../../../../app/core/service/HookManageService';
import { HookType } from '../../../../app/common/enum/Hook';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../../test/TestUtil';
import { HookManageService } from '../../../../app/core/service/HookManageService';
import { Hook } from '../../../../app/core/entity/Hook';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../../test/TestUtil';
import { HookManageService } from '../../../../app/core/service/HookManageService';
import { Hook } from '../../../../app/core/entity/Hook';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../../test/TestUtil';
import { HookManageService } from '../../../../app/core/service/HookManageService';
import { Hook } from '../../../../app/core/entity/Hook';

View File

@@ -1,6 +1,6 @@
import { strict as assert } from 'node:assert';
import { HttpClientRequestOptions } from 'egg';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../test/TestUtil';
import { HookManageService } from '../../../app/core/service/HookManageService';
import { HookType } from '../../../app/common/enum/Hook';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../../test/TestUtil';
import { PackageManagerService } from '../../../../app/core/service/PackageManagerService';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../../test/TestUtil';
import { PackageManagerService } from '../../../../app/core/service/PackageManagerService';
import { UserService } from '../../../../app/core/service/UserService';

View File

@@ -1,6 +1,6 @@
import { strict as assert } from 'node:assert';
import { setTimeout } from 'timers/promises';
import { app, mock } from 'egg-mock/bootstrap';
import { setTimeout } from 'node:timers/promises';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../../test/TestUtil';
import { PackageSyncerService } from '../../../../app/core/service/PackageSyncerService';
import { Task } from '../../../../app/core/entity/Task';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../../../test/TestUtil';
import { PackageSyncerService } from '../../../../app/core/service/PackageSyncerService';
import { PackageManagerService } from '../../../../app/core/service/PackageManagerService';
@@ -1857,6 +1857,7 @@ describe('test/core/service/PackageSyncerService/executeTask.test.ts', () => {
status: 500,
persist: false,
repeats: 3,
data: 'server error',
});
mock.error(NPMRegistry.prototype, 'downloadTarball');
mock.data(NPMRegistry.prototype, 'getFullManifests', {
@@ -1898,6 +1899,7 @@ describe('test/core/service/PackageSyncerService/executeTask.test.ts', () => {
status: 500,
persist: false,
repeats: 3,
data: 'server error',
});
mock.data(NPMRegistry.prototype, 'getFullManifests', {
data: {

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { PackageSyncerService } from '../../../../app/core/service/PackageSyncerService';
import { Task as TaskModel } from '../../../../app/repository/model/Task';
import { HistoryTask as HistoryTaskModel } from '../../../../app/repository/model/HistoryTask';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { PackageSyncerService } from '../../../../app/core/service/PackageSyncerService';
import { RegistryManagerService } from '../../../../app/core/service/RegistryManagerService';
import { Registry } from '../../../../app/core/entity/Registry';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mock } from 'egg-mock/bootstrap';
import { app, mock } from '@eggjs/mock/bootstrap';
import npa from 'npm-package-arg';
import { Package as PackageModel } from '../../../app/repository/model/Package';

View File

@@ -1,5 +1,5 @@
import assert from 'assert';
import { app, mock } from 'egg-mock/bootstrap';
import assert from 'node:assert';
import { app, mock } from '@eggjs/mock/bootstrap';
import { TestUtil } from '../../TestUtil';
import { ProxyCacheService } from '../../../app/core/service/ProxyCacheService';
import { ProxyCacheRepository } from '../../../app/repository/ProxyCacheRepository';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { RegistryManagerService } from '../../../../app/core/service/RegistryManagerService';
import { RegistryType } from '../../../../app/common/enum/Registry';
import { ScopeManagerService } from '../../../../app/core/service/ScopeManagerService';

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app } from 'egg-mock/bootstrap';
import { app } from '@eggjs/mock/bootstrap';
import { ScopeManagerService } from '../../../../app/core/service/ScopeManagerService';
describe('test/core/service/ScopeManagerService/index.test.ts', () => {

View File

@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
import { app, mm } from 'egg-mock/bootstrap';
import { app, mm } from '@eggjs/mock/bootstrap';
import { TaskService } from '../../../../app/core/service/TaskService';
import { PackageSyncerService } from '../../../../app/core/service/PackageSyncerService';
import { TaskState, TaskType } from '../../../../app/common/enum/Task';

Some files were not shown because too many files have changed in this diff Show More