Merge branch 'next' into merge-next

This commit is contained in:
fengmk2
2025-03-09 16:45:43 +08:00
321 changed files with 2299 additions and 1708 deletions

36
.docker/alpine/Dockerfile Normal file
View File

@@ -0,0 +1,36 @@
FROM node:22-alpine
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
COPY . .
RUN chmod +x .docker/build.sh && .docker/build.sh
ENV NODE_ENV=production \
EGG_SERVER_ENV=prod \
CNPMCORE_CONFIG_REGISTRY= \
CNPMCORE_CONFIG_SOURCE_REGISTRY=https://registry.npmmirror.com \
CNPMCORE_CONFIG_SOURCE_REGISTRY_IS_CNPM=true \
CNPMCORE_DATABASE_TYPE= \
CNPMCORE_DATABASE_NAME= \
CNPMCORE_DATABASE_HOST= \
CNPMCORE_DATABASE_PORT=3306 \
CNPMCORE_DATABASE_USER= \
CNPMCORE_DATABASE_PASSWORD= \
CNPMCORE_REDIS_HOST= \
CNPMCORE_REDIS_PORT=6379 \
CNPMCORE_REDIS_PASSWORD= \
CNPMCORE_REDIS_DB= \
CNPMCORE_NFS_TYPE=s3 \
CNPMCORE_NFS_S3_CLIENT_ENDPOINT= \
CNPMCORE_NFS_S3_CLIENT_BUCKET= \
CNPMCORE_NFS_S3_CLIENT_ID= \
CNPMCORE_NFS_S3_CLIENT_SECRET= \
CNPMCORE_NFS_S3_CLIENT_FORCE_PATH_STYLE=true \
CNPMCORE_NFS_S3_CLIENT_DISABLE_URL=true \
TZ=Asia/Shanghai
EXPOSE 7001
CMD ["npm", "run", "start:foreground"]

6
.docker/build.sh Normal file
View File

@@ -0,0 +1,6 @@
#!/bin/sh
npm install -g npminstall --registry=https://registry.npmmirror.com \
&& npminstall -c \
&& npm run tsc \
&& npmupdate -c --production

36
.docker/debian/Dockerfile Normal file
View File

@@ -0,0 +1,36 @@
FROM node:22
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
COPY . .
RUN chmod +x .docker/build.sh && .docker/build.sh
ENV NODE_ENV=production \
EGG_SERVER_ENV=prod \
CNPMCORE_CONFIG_REGISTRY= \
CNPMCORE_CONFIG_SOURCE_REGISTRY=https://registry.npmmirror.com \
CNPMCORE_CONFIG_SOURCE_REGISTRY_IS_CNPM=true \
CNPMCORE_DATABASE_TYPE= \
CNPMCORE_DATABASE_NAME= \
CNPMCORE_DATABASE_HOST= \
CNPMCORE_DATABASE_PORT=3306 \
CNPMCORE_DATABASE_USER= \
CNPMCORE_DATABASE_PASSWORD= \
CNPMCORE_REDIS_HOST= \
CNPMCORE_REDIS_PORT=6379 \
CNPMCORE_REDIS_PASSWORD= \
CNPMCORE_REDIS_DB= \
CNPMCORE_NFS_TYPE=s3 \
CNPMCORE_NFS_S3_CLIENT_ENDPOINT= \
CNPMCORE_NFS_S3_CLIENT_BUCKET= \
CNPMCORE_NFS_S3_CLIENT_ID= \
CNPMCORE_NFS_S3_CLIENT_SECRET= \
CNPMCORE_NFS_S3_CLIENT_FORCE_PATH_STYLE=true \
CNPMCORE_NFS_S3_CLIENT_DISABLE_URL=true \
TZ=Asia/Shanghai
EXPOSE 7001
CMD ["npm", "run", "start:foreground"]

View File

@@ -7,3 +7,44 @@
# CNPMCORE_DATABASE_USER=postgres
# CNPMCORE_DATABASE_PASSWORD=postgres
# CNPMCORE_DATABASE_NAME=cnpmcore
# CNPMCORE_CONFIG_ENABLE_ES=true
# CNPMCORE_CONFIG_ES_CLIENT_NODE=http://localhost:9200
# CNPMCORE_CONFIG_ES_CLIENT_AUTH_USERNAME=elastic
# CNPMCORE_CONFIG_ES_CLIENT_AUTH_PASSWORD=abcdef
# https://github.com/cnpm/cnpmcore/blob/next/docs/elasticsearch-setup.md#%E6%96%B0%E5%BB%BA-env-%E6%96%87%E4%BB%B6
# Password for the 'elastic' user (at least 6 characters)
ELASTIC_PASSWORD="abcdef"
# Password for the 'kibana_system' user (at least 6 characters)
KIBANA_PASSWORD="abcdef"
# Version of Elastic products
STACK_VERSION=8.7.1
# enable for arm64
# STACK_VERSION_ARM64=-arm64
# STACK_PLATFORM=linux/arm64
# Set the cluster name
CLUSTER_NAME=docker-cluster
# Set to 'basic' or 'trial' to automatically start the 30-day trial
LICENSE=basic
#LICENSE=trial
# Port to expose Elasticsearch HTTP API to the host
ES_PORT=9200
#ES_PORT=127.0.0.1:9200
# Port to expose Kibana to the host
KIBANA_PORT=5601
#KIBANA_PORT=80
# Increase or decrease based on the available host memory (in bytes)
ES_MEM_LIMIT=1073741824
KB_MEM_LIMIT=1073741824
LS_MEM_LIMIT=1073741824
# SAMPLE Predefined Key only to be used in POC environments
ENCRYPTION_KEY=c34d38b3a14956121ff2170e5030b471551370178f43e5626eec58b04a30fae2

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

@@ -5,9 +5,9 @@ name: Node.js CI
on:
push:
branches: [ master ]
branches: [ master, next ]
pull_request:
branches: [ master ]
branches: [ master, next ]
jobs:
test-postgresql-fs-nfs:
@@ -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,59 @@ 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 }}
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

@@ -1,7 +1,7 @@
name: Release
on:
push:
branches: [ master ]
branches: [ master, next ]
jobs:
release:

6
.oxlintrc.json Normal file
View File

@@ -0,0 +1,6 @@
{
"plugins": ["import"],
"rules": {
"import/no-cycle": "error"
}
}

View File

@@ -1,7 +1,32 @@
# Changelog
## [3.75.1](https://github.com/cnpm/cnpmcore/compare/v3.75.0...v3.75.1) (2025-03-09)
## [4.0.2](https://github.com/cnpm/cnpmcore/compare/v4.0.1...v4.0.2) (2025-02-10)
* should return default value when env is empty string ([#759](https://github.com/cnpm/cnpmcore/issues/759)) ([b6c781e](https://github.com/cnpm/cnpmcore/commit/b6c781ec250150a689a9d04080ebca716f0840dd))
## [4.0.1](https://github.com/cnpm/cnpmcore/compare/v4.0.0...v4.0.1) (2025-02-09)
### Bug Fixes
* remove npm-cli-login for ssri security ([#754](https://github.com/cnpm/cnpmcore/issues/754)) ([d18981e](https://github.com/cnpm/cnpmcore/commit/d18981e658902dab54297cc5cc4798a6a9e1c84f))
## [4.0.0](https://github.com/cnpm/cnpmcore/compare/v3.74.0...v4.0.0) (2025-02-09)
### ⚠ BREAKING CHANGES
* only support egg >= 4.0.0
the first app on egg v4
https://github.com/eggjs/egg/issues/3644
### Features
* use egg v4 ([#747](https://github.com/cnpm/cnpmcore/issues/747)) ([4427a4f](https://github.com/cnpm/cnpmcore/commit/4427a4fca58e3d1aca4c27f817798f3820db89b9))
## [3.75.1](https://github.com/cnpm/cnpmcore/compare/v3.75.0...v3.75.1) (2025-03-09)
### Bug Fixes

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,17 +0,0 @@
FROM node:20
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
COPY . .
RUN npm install -g npminstall --registry=https://registry.npmmirror.com \
&& npminstall -c \
&& npm run tsc
ENV NODE_ENV=production \
EGG_SERVER_ENV=prod
EXPOSE 7001
CMD ["npm", "run", "start:foreground"]

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,

12
app.ts
View File

@@ -1,7 +1,7 @@
import path from 'path';
import { readFile } from 'fs/promises';
import { Application } from 'egg';
import { ChangesStreamService } from './app/core/service/ChangesStreamService';
import path from 'node:path';
import { readFile } from 'node:fs/promises';
import { Application, ILifecycleBoot } from 'egg';
import { ChangesStreamService } from './app/core/service/ChangesStreamService.js';
declare module 'egg' {
interface Application {
@@ -9,7 +9,7 @@ declare module 'egg' {
}
}
export default class CnpmcoreAppHook {
export default class CnpmcoreAppHook implements ILifecycleBoot {
private readonly app: Application;
constructor(app: Application) {
@@ -17,7 +17,7 @@ export default class CnpmcoreAppHook {
this.app.binaryHTML = '';
}
async configWillLoad() {
configWillLoad() {
const app = this.app;
// https://github.com/eggjs/tegg/blob/master/plugin/orm/app.ts#L37
// store query sql to log

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,40 +0,0 @@
export type ValueType = 'string' | 'boolean' | 'number';
export function env(key: string, valueType: ValueType, defaultValue: string): string;
export function env(key: string, valueType: ValueType, defaultValue: boolean): boolean;
export function env(key: string, valueType: ValueType, defaultValue: number): number;
export function env(key: string, valueType: ValueType, defaultValue: string | boolean | number): string | boolean | number {
let value = process.env[key];
if (typeof value === 'string') {
value = value.trim();
}
if (!value) {
return defaultValue;
}
if (valueType === 'string') {
return value;
}
if (valueType === 'boolean') {
let booleanValue = false;
if (value === 'true' || value === '1') {
booleanValue = true;
} else if (value === 'false' || value === '0') {
booleanValue = false;
} else {
throw new TypeError(`Invalid boolean value: ${value} on process.env.${key}`);
}
return booleanValue;
}
if (valueType === 'number') {
const numberValue = Number(value);
if (isNaN(numberValue)) {
throw new TypeError(`Invalid number value: ${value} on process.env.${key}`);
}
return numberValue;
}
throw new TypeError(`Invalid value type: ${valueType}`);
}

View File

@@ -6,7 +6,7 @@ import url from 'node:url';
import { randomBytes } from 'node:crypto';
import { EggContextHttpClient, HttpClientResponse } from 'egg';
import mime from 'mime-types';
import dayjs from './dayjs';
import dayjs from './dayjs.js';
interface DownloadToTempfileOptionalConfig {
retries?: number,

View File

@@ -2,8 +2,9 @@ import { createReadStream } from 'node:fs';
import { Readable } from 'node:stream';
import { pipeline } from 'node:stream/promises';
import * as ssri from 'ssri';
// @ts-expect-error type error
import tar from '@fengmk2/tar';
import { AuthorType, PackageJSONType } from '../repository/PackageRepository';
import type { AuthorType, PackageJSONType } from '../repository/PackageRepository.js';
// /@cnpm%2ffoo
@@ -12,7 +13,7 @@ import { AuthorType, PackageJSONType } from '../repository/PackageRepository';
// /foo
// name max length is 214 chars
// https://www.npmjs.com/package/path-to-regexp#custom-matching-parameters
export const FULLNAME_REG_STRING = '@[^/]{1,220}\/[^/]{1,220}|@[^%]+\%2[fF][^/]{1,220}|[^@/]{1,220}';
export const FULLNAME_REG_STRING = '@[^/]{1,220}/[^/]{1,220}|@[^%]+%2[fF][^/]{1,220}|[^@/]{1,220}';
export function getScopeAndName(fullname: string): string[] {
if (fullname.startsWith('@')) {
@@ -86,7 +87,7 @@ export async function hasShrinkWrapInTgz(contentOrFile: Uint8Array | string): Pr
const parser = tar.t({
// options.strict 默认为 false会忽略 Recoverable errors例如 tar 解析失败
// 详见 https://github.com/isaacs/node-tar#warnings-and-errors
onentry(entry) {
onentry(entry: any) {
if (entry.path === 'package/npm-shrinkwrap.json') {
hasShrinkWrap = true;
abortController.abort();
@@ -122,8 +123,8 @@ export async function extractPackageJSON(tarballBytes: Buffer): Promise<PackageJ
return new Promise((resolve, reject) => {
Readable.from(tarballBytes)
.pipe(tar.t({
filter: name => name === 'package/package.json',
onentry: async entry => {
filter: (name: string) => name === 'package/package.json',
onentry: async (entry: any) => {
const chunks: Buffer[] = [];
for await (const chunk of entry) {
chunks.push(chunk);
@@ -131,7 +132,7 @@ export async function extractPackageJSON(tarballBytes: Buffer): Promise<PackageJ
try {
const data = Buffer.concat(chunks);
return resolve(JSON.parse(data.toString()));
} catch (err) {
} catch {
reject(new Error('Error parsing package.json'));
}
},

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

@@ -1,5 +1,5 @@
import { AccessLevel, SingletonProto } from '@eggjs/tegg';
import { BugVersion } from '../../core/entity/BugVersion';
import { BugVersion } from '../../core/entity/BugVersion.js';
@SingletonProto({
accessLevel: AccessLevel.PUBLIC,

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,
@@ -6,9 +7,8 @@ import {
} from '@eggjs/tegg';
import { Pointcut } from '@eggjs/tegg/aop';
import { EggLogger } from 'egg';
import { AsyncTimer } from '../aop/AsyncTimer';
import { NFSClient } from '../typing';
import { IncomingHttpHeaders } from 'http';
import { AsyncTimer } from '../aop/AsyncTimer.js';
import { NFSClient } from '../typing.js';
const INSTANCE_NAME = 'nfsAdapter';

View File

@@ -1,4 +1,4 @@
import { setTimeout } from 'timers/promises';
import { setTimeout } from 'node:timers/promises';
import {
ContextProto,
AccessLevel,
@@ -11,8 +11,8 @@ import {
HttpClientRequestOptions,
HttpClientResponse,
} from 'egg';
import { PackageManifestType } from '../../repository/PackageRepository';
import { isTimeoutError } from '../ErrorUtil';
import { PackageManifestType } from '../../repository/PackageRepository.js';
import { isTimeoutError } from '../ErrorUtil.js';
type HttpMethod = HttpClientRequestOptions['method'];

View File

@@ -1,7 +1,7 @@
import { ImplDecorator, Inject, QualifierImplDecoratorUtil } from '@eggjs/tegg';
import { BinaryType } from '../../enum/Binary';
import { EggHttpClient, EggLogger } from 'egg';
import { BinaryName, BinaryTaskConfig } from '../../../../config/binaries';
import { BinaryType } from '../../enum/Binary.js';
import { BinaryName, BinaryTaskConfig } from '../../../../config/binaries.js';
export type BinaryItem = {
name: string;

View File

@@ -1,7 +1,7 @@
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary';
import { Inject, SingletonProto } from '@eggjs/tegg';
import { BinaryType } from '../../enum/Binary';
import { EggAppConfig } from 'egg';
import { BinaryType } from '../../enum/Binary.js';
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary.js';
@SingletonProto()
@BinaryAdapter(BinaryType.Api)

View File

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

View File

@@ -1,7 +1,7 @@
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';
import { BinaryType } from '../../enum/Binary.js';
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary.js';
@SingletonProto()
@BinaryAdapter(BinaryType.ChromeForTesting)

View File

@@ -1,6 +1,6 @@
import { SingletonProto } from '@eggjs/tegg';
import { BinaryType } from '../../enum/Binary';
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary';
import { BinaryType } from '../../enum/Binary.js';
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary.js';
@SingletonProto()
@BinaryAdapter(BinaryType.Cypress)

View File

@@ -2,8 +2,8 @@ import path from 'node:path';
import { SingletonProto } from '@eggjs/tegg';
import {
AbstractBinary, FetchResult, BinaryItem, BinaryAdapter,
} from './AbstractBinary';
import { BinaryType } from '../../enum/Binary';
} from './AbstractBinary.js';
import { BinaryType } from '../../enum/Binary.js';
@SingletonProto()
@BinaryAdapter(BinaryType.Edgedriver)
@@ -175,7 +175,7 @@ export class EdgedriverBinary extends AbstractBinary {
#parseItems(xml: string): BinaryItem[] {
const items: BinaryItem[] = [];
// <Blob><Name>124.0.2478.97/edgedriver_arm64.zip</Name><Url>https://msedgewebdriverstorage.blob.core.windows.net/edgewebdriver/124.0.2478.97/edgedriver_arm64.zip</Url><Properties><Last-Modified>Fri, 10 May 2024 18:35:44 GMT</Last-Modified><Etag>0x8DC712000713C13</Etag><Content-Length>9191362</Content-Length><Content-Type>application/octet-stream</Content-Type><Content-Encoding /><Content-Language /><Content-MD5>1tjPTf5JU6KKB06Qf1JOGw==</Content-MD5><Cache-Control /><BlobType>BlockBlob</BlobType><LeaseStatus>unlocked</LeaseStatus></Properties></Blob>
const fileRe = /<Blob><Name>([^<]+?)<\/Name><Url>([^<]+?)<\/Url><Properties><Last\-Modified>([^<]+?)<\/Last\-Modified><Etag>(?:[^<]+?)<\/Etag><Content\-Length>(\d+)<\/Content\-Length>/g;
const fileRe = /<Blob><Name>([^<]+?)<\/Name><Url>([^<]+?)<\/Url><Properties><Last-Modified>([^<]+?)<\/Last-Modified><Etag>(?:[^<]+?)<\/Etag><Content-Length>(\d+)<\/Content-Length>/g;
const matchItems = xml.matchAll(fileRe);
for (const m of matchItems) {
const fullname = m[1].trim();

View File

@@ -1,8 +1,8 @@
import { SingletonProto } from '@eggjs/tegg';
import { BinaryType } from '../../enum/Binary';
import binaries, { BinaryName } from '../../../../config/binaries';
import { BinaryAdapter, BinaryItem, FetchResult } from './AbstractBinary';
import { GithubBinary } from './GithubBinary';
import binaries, { BinaryName } from '../../../../config/binaries.js';
import { BinaryType } from '../../enum/Binary.js';
import { BinaryAdapter, BinaryItem, FetchResult } from './AbstractBinary.js';
import { GithubBinary } from './GithubBinary.js';
@SingletonProto()
@BinaryAdapter(BinaryType.Electron)

View File

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

View File

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

View File

@@ -1,8 +1,8 @@
import { basename } from 'node:path';
import { SingletonProto } from '@eggjs/tegg';
import { BinaryType } from '../../enum/Binary';
import binaries, { BinaryName } from '../../../../config/binaries';
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary';
import { BinaryType } from '../../enum/Binary.js';
import binaries, { BinaryName } from '../../../../config/binaries.js';
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary.js';
@SingletonProto()
@BinaryAdapter(BinaryType.Node)
@@ -30,7 +30,7 @@ export class NodeBinary extends AbstractBinary {
// <a href="/dist/v18.15.0/SHASUMS256.txt.asc">SHASUMS256.txt.asc</a> 04-Nov-2024 17:29 3.7 KB
// <a href="/dist/v18.15.0/SHASUMS256.txt.sig">SHASUMS256.txt.sig</a> 04-Nov-2024 17:29 310 B
// <a href="/dist/v18.15.0/SHASUMS256.txt">SHASUMS256.txt</a> 04-Nov-2024 17:29 3.2 KB
const re = /<a href="([^\"]+?)"[^>]*?>[^<]+?<\/a>\s+?((?:[\w\-]+? \w{2}\:\d{2})|\-)\s+?([\d\.\-\s\w]+)/ig;
const re = /<a href="([^"]+?)"[^>]*?>[^<]+?<\/a>\s+?((?:[\w-]+? \w{2}:\d{2})|-)\s+?([\d.\-\s\w]+)/ig;
const matchs = html.matchAll(re);
const items: BinaryItem[] = [];
for (const m of matchs) {

View File

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

View File

@@ -1,8 +1,8 @@
import { SingletonProto } from '@eggjs/tegg';
import { BinaryType } from '../../enum/Binary';
import binaries from '../../../../config/binaries';
import { FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary';
import { BucketBinary } from './BucketBinary';
import binaries from '../../../../config/binaries.js';
import { BinaryType } from '../../enum/Binary.js';
import { FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary.js';
import { BucketBinary } from './BucketBinary.js';
@SingletonProto()
@BinaryAdapter(BinaryType.Nwjs)

View File

@@ -1,9 +1,8 @@
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';
import { BinaryType } from '../../enum/Binary.js';
import { AbstractBinary, BinaryAdapter, BinaryItem, FetchResult } from './AbstractBinary.js';
const PACKAGE_URL = 'https://registry.npmjs.com/playwright-core';
const DOWNLOAD_HOST = 'https://playwright.azureedge.net/';

View File

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

View File

@@ -1,6 +1,6 @@
import { SingletonProto } from '@eggjs/tegg';
import { BinaryType } from '../../enum/Binary';
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary';
import { BinaryType } from '../../enum/Binary.js';
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary.js';
@SingletonProto()
@BinaryAdapter(BinaryType.Puppeteer)
@@ -37,7 +37,7 @@ export class PuppeteerBinary extends AbstractBinary {
// };
const unpkgURL = 'https://unpkg.com/puppeteer-core@latest/lib/cjs/puppeteer/revisions.js';
const text = await this.requestXml(unpkgURL);
const m = /chromium:\s+\'(\d+)\'\,/.exec(text);
const m = /chromium:\s+'(\d+)',/.exec(text);
if (m && !chromiumRevisions.has(m[1])) {
chromiumRevisions.set(m[1], new Date().toISOString());
}

View File

@@ -1,6 +1,6 @@
import { SingletonProto } from '@eggjs/tegg';
import { BinaryType } from '../../enum/Binary';
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary';
import { BinaryType } from '../../enum/Binary.js';
import { AbstractBinary, FetchResult, BinaryItem, BinaryAdapter } from './AbstractBinary.js';
@SingletonProto()
@BinaryAdapter(BinaryType.Sqlcipher)

View File

@@ -3,8 +3,8 @@ import {
Inject,
QualifierImplDecoratorUtil,
} from '@eggjs/tegg';
import { RegistryType } from '../../../common/enum/Registry';
import { Registry } from '../../../core/entity/Registry';
import { RegistryType } from '../../../common/enum/Registry.js';
import { Registry } from '../../../core/entity/Registry.js';
import {
EggHttpClient,
EggLogger,

View File

@@ -1,8 +1,8 @@
import { SingletonProto } from '@eggjs/tegg';
import { RegistryType } from '../../../common/enum/Registry';
import { Registry } from '../../../core/entity/Registry';
import { E500 } from 'egg-errors';
import { AbstractChangeStream, RegistryChangesStream } from './AbstractChangesStream';
import { RegistryType } from '../../../common/enum/Registry.js';
import { Registry } from '../../../core/entity/Registry.js';
import { AbstractChangeStream, RegistryChangesStream } from './AbstractChangesStream.js';
@SingletonProto()
@RegistryChangesStream(RegistryType.Cnpmcore)

View File

@@ -1,8 +1,8 @@
import { SingletonProto } from '@eggjs/tegg';
import { RegistryType } from '../../../common/enum/Registry';
import { Registry } from '../../../core/entity/Registry';
import { E500 } from 'egg-errors';
import { AbstractChangeStream, RegistryChangesStream } from './AbstractChangesStream';
import { RegistryType } from '../../../common/enum/Registry.js';
import { Registry } from '../../../core/entity/Registry.js';
import { AbstractChangeStream, RegistryChangesStream } from './AbstractChangesStream.js';
const MAX_LIMIT = 10000;

View File

@@ -1,8 +1,8 @@
import { SingletonProto } from '@eggjs/tegg';
import { E500 } from 'egg-errors';
import { RegistryType } from '../../../common/enum/Registry';
import { Registry } from '../../../core/entity/Registry';
import { AbstractChangeStream, ChangesStreamChange, RegistryChangesStream } from './AbstractChangesStream';
import { RegistryType } from '../../../common/enum/Registry.js';
import { Registry } from '../../../core/entity/Registry.js';
import { AbstractChangeStream, ChangesStreamChange, RegistryChangesStream } from './AbstractChangesStream.js';
@SingletonProto()
@RegistryChangesStream(RegistryType.Npm)

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,5 +1,5 @@
import dayjs from 'dayjs';
import customParseFormat from 'dayjs/plugin/customParseFormat';
import customParseFormat from 'dayjs/plugin/customParseFormat.js';
dayjs.extend(customParseFormat);
export default dayjs;

View File

@@ -2,5 +2,6 @@
"name": "cnpmcore-common",
"eggModule": {
"name": "cnpmcoreCommon"
}
},
"type": "module"
}

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.js';
export interface UploadResult {
key: string;

View File

@@ -1,5 +1,5 @@
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
interface BinaryData extends EntityData {
binaryId: string;

View File

@@ -1,5 +1,5 @@
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
interface ChangeData extends EntityData {
changeId: string;

View File

@@ -1,5 +1,5 @@
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
interface DistData extends EntityData {
distId: 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';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
import { HookType } from '../../common/enum/Hook.js';
export type CreateHookData = Omit<EasyData<HookData, 'hookId'>, 'enable' | 'latestTaskId'>;

View File

@@ -1,4 +1,4 @@
import { HookEventType } from '../../common/enum/Hook';
import { HookEventType } from '../../common/enum/Hook.js';
export interface PublishChangePayload {
'dist-tag'?: string;

View File

@@ -1,7 +1,7 @@
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { Dist } from './Dist';
import { getFullname } from '../../common/PackageUtil';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
import { Dist } from './Dist.js';
import { getFullname } from '../../common/PackageUtil.js';
interface PackageData extends EntityData {
scope: string;
@@ -22,6 +22,10 @@ export enum DIST_NAMES {
ABBREVIATED_MANIFESTS = 'abbreviated_manifests.json',
}
export function isPkgManifest(fileType: DIST_NAMES) {
return fileType === DIST_NAMES.FULL_MANIFESTS || fileType === DIST_NAMES.ABBREVIATED_MANIFESTS;
}
interface FileInfo {
size: number;
shasum: string;

View File

@@ -1,5 +1,5 @@
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
interface PackageTagData extends EntityData {
packageId: string;

View File

@@ -1,7 +1,7 @@
import { Dist } from './Dist';
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { PaddingSemVer } from './PaddingSemVer';
import { Dist } from './Dist.js';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
import { PaddingSemVer } from './PaddingSemVer.js';
interface PackageVersionData extends EntityData {
packageId: string;

View File

@@ -1,5 +1,5 @@
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
interface PackageVersionBlockData extends EntityData {
packageVersionBlockId: string;

View File

@@ -1,6 +1,6 @@
import { Dist } from './Dist';
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { Dist } from './Dist.js';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
interface PackageVersionFileData extends EntityData {
packageVersionFileId: string;

View File

@@ -1,5 +1,5 @@
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
interface PackageVersionManifestData extends EntityData {
packageId: string;

View File

@@ -1,8 +1,7 @@
import { Entity, EntityData } from './Entity';
import { EasyData } from '../util/EntityUtil';
import { DIST_NAMES } from './Package';
import { isPkgManifest } from '../service/ProxyCacheService';
import { PROXY_CACHE_DIR_NAME } from '../../common/constants';
import { Entity, EntityData } from './Entity.js';
import { EasyData } from '../util/EntityUtil.js';
import { DIST_NAMES, isPkgManifest } from './Package.js';
import { PROXY_CACHE_DIR_NAME } from '../../common/constants.js';
interface ProxyCacheData extends EntityData {
fullname: string;
fileType: DIST_NAMES;

View File

@@ -1,6 +1,6 @@
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import type { RegistryType } from '../../common/enum/Registry';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
import type { RegistryType } from '../../common/enum/Registry.js';
interface RegistryData extends EntityData {
name: string;

View File

@@ -1,5 +1,5 @@
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
interface ScopeData extends EntityData {
name: string;

View File

@@ -1,5 +1,5 @@
import { Range, Comparator } from 'semver';
import { PaddingSemVer } from './PaddingSemVer';
import { PaddingSemVer } from './PaddingSemVer.js';
const OPERATOR_MAP = {
'<': '$lt',

View File

@@ -1,14 +1,13 @@
import os from 'os';
import path from 'path';
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { TaskType, TaskState } from '../../common/enum/Task';
import { PROXY_CACHE_DIR_NAME } from '../../common/constants';
import dayjs from '../../common/dayjs';
import { HookEvent } from './HookEvent';
import { DIST_NAMES } from './Package';
import { isPkgManifest } from '../service/ProxyCacheService';
import os from 'node:os';
import path from 'node:path';
import { InternalServerError } from 'egg-errors';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
import { TaskType, TaskState } from '../../common/enum/Task.js';
import { PROXY_CACHE_DIR_NAME } from '../../common/constants.js';
import dayjs from '../../common/dayjs.js';
import { HookEvent } from './HookEvent.js';
import { DIST_NAMES, isPkgManifest } from './Package.js';
export const HOST_NAME = os.hostname();
export const PID = process.pid;

View File

@@ -1,6 +1,6 @@
import dayjs from 'dayjs';
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
export enum TokenType {
granular = 'granular',

View File

@@ -1,6 +1,6 @@
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { cleanUserPrefix } from '../../common/PackageUtil';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
import { cleanUserPrefix } from '../../common/PackageUtil.js';
interface UserData extends EntityData {
userId: string;

View File

@@ -1,5 +1,5 @@
import { Entity, EntityData } from './Entity';
import { EasyData, EntityUtil } from '../util/EntityUtil';
import { Entity, EntityData } from './Entity.js';
import { EasyData, EntityUtil } from '../util/EntityUtil.js';
interface WebauthnCredentialData extends EntityData {
wancId: string;

View File

@@ -1,8 +1,8 @@
import { Event, Inject } from '@eggjs/tegg';
import { EggLogger } from 'egg';
import { PACKAGE_VERSION_ADDED } from './index';
import { BUG_VERSIONS } from '../../common/constants';
import { BugVersionService } from '../service/BugVersionService';
import { PACKAGE_VERSION_ADDED } from './index.js';
import { BUG_VERSIONS } from '../../common/constants.js';
import { BugVersionService } from '../service/BugVersionService.js';
@Event(PACKAGE_VERSION_ADDED)
export class BugVersionFixHandler {

View File

@@ -11,8 +11,8 @@ import {
PACKAGE_MAINTAINER_CHANGED,
PACKAGE_MAINTAINER_REMOVED,
PACKAGE_META_CHANGED,
} from './index';
import { CacheService } from '../../core/service/CacheService';
} from './index.js';
import { CacheService } from '../../core/service/CacheService.js';
class CacheCleanerEvent {
@Inject()

View File

@@ -10,13 +10,13 @@ import {
PACKAGE_MAINTAINER_CHANGED,
PACKAGE_MAINTAINER_REMOVED,
PACKAGE_META_CHANGED, PackageMetaChange,
} from './index';
import { ChangeRepository } from '../../repository/ChangeRepository';
import { Change } from '../entity/Change';
import { HookEvent } from '../entity/HookEvent';
import { Task } from '../entity/Task';
import { User } from '../entity/User';
import { TaskService } from '../service/TaskService';
} from './index.js';
import { ChangeRepository } from '../../repository/ChangeRepository.js';
import { Change } from '../entity/Change.js';
import { HookEvent } from '../entity/HookEvent.js';
import { Task } from '../entity/Task.js';
import { User } from '../entity/User.js';
import { TaskService } from '../service/TaskService.js';
class ChangesStreamEvent {
@Inject()

View File

@@ -2,11 +2,11 @@ import { Event, Inject } from '@eggjs/tegg';
import {
EggAppConfig,
} from 'egg';
import { PACKAGE_VERSION_ADDED } from './index';
import { getScopeAndName } from '../../common/PackageUtil';
import { PackageVersionManifest as PackageVersionManifestEntity } from '../entity/PackageVersionManifest';
import { PackageRepository } from '../../repository/PackageRepository';
import { DistRepository } from '../../repository/DistRepository';
import { PACKAGE_VERSION_ADDED } from './index.js';
import { getScopeAndName } from '../../common/PackageUtil.js';
import { PackageVersionManifest as PackageVersionManifestEntity } from '../entity/PackageVersionManifest.js';
import { PackageRepository } from '../../repository/PackageRepository.js';
import { DistRepository } from '../../repository/DistRepository.js';
class StoreManifestEvent {
@Inject()

View File

@@ -14,9 +14,8 @@ import {
PACKAGE_META_CHANGED,
PACKAGE_BLOCKED,
PACKAGE_UNBLOCKED,
} from './index';
import { PackageSearchService } from '../service/PackageSearchService';
} from './index.js';
import { PackageSearchService } from '../service/PackageSearchService.js';
class SyncESPackage {
@Inject()

View File

@@ -3,10 +3,10 @@ import {
EggAppConfig, EggLogger,
} from 'egg';
import { ForbiddenError } from 'egg-errors';
import { PACKAGE_VERSION_ADDED, PACKAGE_TAG_ADDED, PACKAGE_TAG_CHANGED } from './index';
import { getScopeAndName } from '../../common/PackageUtil';
import { PackageManagerService } from '../service/PackageManagerService';
import { PackageVersionFileService } from '../service/PackageVersionFileService';
import { PACKAGE_VERSION_ADDED, PACKAGE_TAG_ADDED, PACKAGE_TAG_CHANGED } from './index.js';
import { getScopeAndName } from '../../common/PackageUtil.js';
import { PackageManagerService } from '../service/PackageManagerService.js';
import { PackageVersionFileService } from '../service/PackageVersionFileService.js';
class SyncPackageVersionFileEvent {
@Inject()

View File

@@ -1,5 +1,5 @@
import '@eggjs/tegg';
import { User } from '../entity/User';
import { User } from '../entity/User.js';
export const PACKAGE_UNPUBLISHED = 'PACKAGE_UNPUBLISHED';
export const PACKAGE_BLOCKED = 'PACKAGE_BLOCKED';

View File

@@ -2,5 +2,6 @@
"name": "cnpmcore-core",
"eggModule": {
"name": "cnpmcoreCore"
}
},
"type": "module"
}

View File

@@ -1,4 +1,3 @@
import { rm } from 'fs/promises';
import {
AccessLevel,
SingletonProto,
@@ -8,20 +7,20 @@ import {
import {
EggHttpClient,
} from 'egg';
import fs from 'fs/promises';
import { sortBy } from 'lodash';
import binaries, { BinaryName, CategoryName } from '../../../config/binaries';
import { BinaryRepository } from '../../repository/BinaryRepository';
import { Task } from '../entity/Task';
import { Binary } from '../entity/Binary';
import { TaskService } from './TaskService';
import { NFSAdapter } from '../../common/adapter/NFSAdapter';
import { downloadToTempfile } from '../../common/FileUtil';
import { isTimeoutError } from '../../common/ErrorUtil';
import { AbstractBinary, BinaryItem } from '../../common/adapter/binary/AbstractBinary';
import { AbstractService } from '../../common/AbstractService';
import { BinaryType } from '../../common/enum/Binary';
import { TaskType, TaskState } from '../../common/enum/Task';
import fs from 'node:fs/promises';
import { sortBy } from 'lodash-es';
import binaries, { BinaryName, CategoryName } from '../../../config/binaries.js';
import { BinaryRepository } from '../../repository/BinaryRepository.js';
import { Task } from '../entity/Task.js';
import { Binary } from '../entity/Binary.js';
import { TaskService } from './TaskService.js';
import { NFSAdapter } from '../../common/adapter/NFSAdapter.js';
import { downloadToTempfile } from '../../common/FileUtil.js';
import { isTimeoutError } from '../../common/ErrorUtil.js';
import { AbstractBinary, BinaryItem } from '../../common/adapter/binary/AbstractBinary.js';
import { AbstractService } from '../../common/AbstractService.js';
import { BinaryType } from '../../common/enum/Binary.js';
import { TaskType, TaskState } from '../../common/enum/Task.js';
function isoNow() {
return new Date().toISOString();
@@ -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,13 +1,13 @@
import { AccessLevel, SingletonProto, Inject } from '@eggjs/tegg';
import { EggLogger } from 'egg';
import pMap from 'p-map';
import { BugVersion } from '../entity/BugVersion';
import { PackageJSONType, PackageRepository } from '../../repository/PackageRepository';
import { DistRepository } from '../../repository/DistRepository';
import { getScopeAndName } from '../../common/PackageUtil';
import { CacheService } from './CacheService';
import { BUG_VERSIONS, LATEST_TAG } from '../../common/constants';
import { BugVersionStore } from '../../common/adapter/BugVersionStore';
import { BugVersion } from '../entity/BugVersion.js';
import { PackageJSONType, PackageRepository } from '../../repository/PackageRepository.js';
import { DistRepository } from '../../repository/DistRepository.js';
import { getScopeAndName } from '../../common/PackageUtil.js';
import { CacheService } from './CacheService.js';
import { BUG_VERSIONS, LATEST_TAG } from '../../common/constants.js';
import { BugVersionStore } from '../../common/adapter/BugVersionStore.js';
@SingletonProto({
accessLevel: AccessLevel.PUBLIC,

View File

@@ -3,11 +3,11 @@ import {
SingletonProto,
Inject,
} from '@eggjs/tegg';
import { CacheAdapter } from '../../common/adapter/CacheAdapter';
import { AbstractService } from '../../common/AbstractService';
import { ChangesStreamTaskData } from '../entity/Task';
import { CacheAdapter } from '../../common/adapter/CacheAdapter.js';
import { AbstractService } from '../../common/AbstractService.js';
import { ChangesStreamTaskData } from '../entity/Task.js';
type PackageCacheAttribe = 'etag' | 'manifests';
type PackageCacheAttribute = 'etag' | 'manifests';
export type UpstreamRegistryInfo = {
registry_name: string;
@@ -95,14 +95,14 @@ export class CacheService extends AbstractService {
public async removeCache(fullname: string) {
await Promise.all([
await this.cacheAdapter.delete(this.cacheKey(fullname, true, 'etag')),
await this.cacheAdapter.delete(this.cacheKey(fullname, true, 'manifests')),
await this.cacheAdapter.delete(this.cacheKey(fullname, false, 'etag')),
await this.cacheAdapter.delete(this.cacheKey(fullname, false, 'manifests')),
this.cacheAdapter.delete(this.cacheKey(fullname, true, 'etag')),
this.cacheAdapter.delete(this.cacheKey(fullname, true, 'manifests')),
this.cacheAdapter.delete(this.cacheKey(fullname, false, 'etag')),
this.cacheAdapter.delete(this.cacheKey(fullname, false, 'manifests')),
]);
}
private cacheKey(fullname: string, isFullManifests: boolean, attribute: PackageCacheAttribe) {
private cacheKey(fullname: string, isFullManifests: boolean, attribute: PackageCacheAttribute) {
return `${fullname}|${isFullManifests ? 'full' : 'abbr'}:${attribute}`;
}
}

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,
@@ -7,20 +7,20 @@ import {
Inject,
} from '@eggjs/tegg';
import { E500 } from 'egg-errors';
import { PackageSyncerService, RegistryNotMatchError } from './PackageSyncerService';
import { TaskService } from './TaskService';
import { RegistryManagerService } from './RegistryManagerService';
import { ScopeManagerService } from './ScopeManagerService';
import { PackageRepository } from '../../repository/PackageRepository';
import { TaskRepository } from '../../repository/TaskRepository';
import { HOST_NAME, ChangesStreamTask, Task } from '../entity/Task';
import { Registry } from '../entity/Registry';
import { AbstractChangeStream } from '../../common/adapter/changesStream/AbstractChangesStream';
import { getScopeAndName } from '../../common/PackageUtil';
import { isTimeoutError } from '../../common/ErrorUtil';
import { GLOBAL_WORKER } from '../../common/constants';
import { TaskState, TaskType } from '../../common/enum/Task';
import { AbstractService } from '../../common/AbstractService';
import { PackageSyncerService, RegistryNotMatchError } from './PackageSyncerService.js';
import { TaskService } from './TaskService.js';
import { RegistryManagerService } from './RegistryManagerService.js';
import { ScopeManagerService } from './ScopeManagerService.js';
import { PackageRepository } from '../../repository/PackageRepository.js';
import { TaskRepository } from '../../repository/TaskRepository.js';
import { HOST_NAME, ChangesStreamTask, Task } from '../entity/Task.js';
import { Registry } from '../entity/Registry.js';
import { AbstractChangeStream } from '../../common/adapter/changesStream/AbstractChangesStream.js';
import { getScopeAndName } from '../../common/PackageUtil.js';
import { isTimeoutError } from '../../common/ErrorUtil.js';
import { GLOBAL_WORKER } from '../../common/constants.js';
import { TaskState, TaskType } from '../../common/enum/Task.js';
import { AbstractService } from '../../common/AbstractService.js';
@SingletonProto({
accessLevel: AccessLevel.PUBLIC,

View File

@@ -1,16 +1,16 @@
import { AccessLevel, SingletonProto, Inject } from '@eggjs/tegg';
import { AbstractService } from '../../common/AbstractService';
import { HookType } from '../../common/enum/Hook';
import { TaskState } from '../../common/enum/Task';
import { HookEvent } from '../entity/HookEvent';
import { CreateHookTask, Task } from '../entity/Task';
import { HookRepository } from '../../repository/HookRepository';
import { PackageRepository } from '../../repository/PackageRepository';
import pMap from 'p-map';
import { Hook } from '../entity/Hook';
import { TaskService } from './TaskService';
import { isoNow } from '../../common/LogUtil';
import { getScopeAndName } from '../../common/PackageUtil';
import { AbstractService } from '../../common/AbstractService.js';
import { HookType } from '../../common/enum/Hook.js';
import { TaskState } from '../../common/enum/Task.js';
import { HookEvent } from '../entity/HookEvent.js';
import { CreateHookTask, Task } from '../entity/Task.js';
import { HookRepository } from '../../repository/HookRepository.js';
import { PackageRepository } from '../../repository/PackageRepository.js';
import { Hook } from '../entity/Hook.js';
import { TaskService } from './TaskService.js';
import { isoNow } from '../../common/LogUtil.js';
import { getScopeAndName } from '../../common/PackageUtil.js';
@SingletonProto({
accessLevel: AccessLevel.PUBLIC,

View File

@@ -1,8 +1,8 @@
import { SingletonProto, AccessLevel, Inject } from '@eggjs/tegg';
import { EggLogger } from 'egg';
import pMap from 'p-map';
import { PackageVersionRepository } from '../../repository/PackageVersionRepository';
import { PaddingSemVer } from '../entity/PaddingSemVer';
import { PackageVersionRepository } from '../../repository/PackageVersionRepository.js';
import { PaddingSemVer } from '../entity/PaddingSemVer.js';
@SingletonProto({
accessLevel: AccessLevel.PUBLIC,

View File

@@ -2,9 +2,9 @@ import {
AccessLevel,
SingletonProto,
} from '@eggjs/tegg';
import { AbstractService } from '../../common/AbstractService';
import { NOT_IMPLEMENTED_PATH } from '../../common/constants';
import { NotFoundError, NotImplementedError } from 'egg-errors';
import { AbstractService } from '../../common/AbstractService.js';
import { NOT_IMPLEMENTED_PATH } from '../../common/constants.js';
@SingletonProto({
accessLevel: AccessLevel.PUBLIC,

View File

@@ -1,12 +1,12 @@
import { AccessLevel, SingletonProto, Inject } from '@eggjs/tegg';
import { Hook } from '../entity/Hook';
import { HookType } from '../../common/enum/Hook';
import {
ForbiddenError,
NotFoundError,
} from 'egg-errors';
import { HookRepository } from '../../repository/HookRepository';
import { EggAppConfig } from 'egg';
import { HookRepository } from '../../repository/HookRepository.js';
import { Hook } from '../entity/Hook.js';
import { HookType } from '../../common/enum/Hook.js';
export interface CreateHookCommand {
type: HookType;

View File

@@ -1,16 +1,16 @@
import { AccessLevel, SingletonProto, Inject } from '@eggjs/tegg';
import { TriggerHookTask } from '../entity/Task';
import { HookEvent } from '../entity/HookEvent';
import { HookRepository } from '../../repository/HookRepository';
import { PackageRepository } from '../../repository/PackageRepository';
import { DistRepository } from '../../repository/DistRepository';
import { UserRepository } from '../../repository/UserRepository';
import { Hook } from '../entity/Hook';
import { EggContextHttpClient } from 'egg';
import { isoNow } from '../../common/LogUtil';
import { TaskState } from '../../common/enum/Task';
import { TaskService } from './TaskService';
import { getScopeAndName } from '../../common/PackageUtil';
import { TriggerHookTask } from '../entity/Task.js';
import { HookEvent } from '../entity/HookEvent.js';
import { HookRepository } from '../../repository/HookRepository.js';
import { PackageRepository } from '../../repository/PackageRepository.js';
import { DistRepository } from '../../repository/DistRepository.js';
import { UserRepository } from '../../repository/UserRepository.js';
import { Hook } from '../entity/Hook.js';
import { isoNow } from '../../common/LogUtil.js';
import { TaskState } from '../../common/enum/Task.js';
import { TaskService } from './TaskService.js';
import { getScopeAndName } from '../../common/PackageUtil.js';
@SingletonProto({
accessLevel: AccessLevel.PUBLIC,

View File

@@ -18,19 +18,25 @@ import {
getFullname,
getScopeAndName,
hasShrinkWrapInTgz,
} from '../../common/PackageUtil';
import { AbstractService } from '../../common/AbstractService';
import { AbbreviatedPackageJSONType, AbbreviatedPackageManifestType, PackageJSONType, PackageManifestType, PackageRepository } from '../../repository/PackageRepository';
import { PackageVersionBlockRepository } from '../../repository/PackageVersionBlockRepository';
import { PackageVersionDownloadRepository } from '../../repository/PackageVersionDownloadRepository';
import { DistRepository } from '../../repository/DistRepository';
import { isDuplicateKeyError } from '../../repository/util/ErrorUtil';
import { Package } from '../entity/Package';
import { PackageVersion } from '../entity/PackageVersion';
import { PackageVersionBlock } from '../entity/PackageVersionBlock';
import { PackageTag } from '../entity/PackageTag';
import { User } from '../entity/User';
import { Dist } from '../entity/Dist';
} from '../../common/PackageUtil.js';
import { AbstractService } from '../../common/AbstractService.js';
import {
AbbreviatedPackageJSONType,
AbbreviatedPackageManifestType,
PackageJSONType,
PackageManifestType,
PackageRepository,
} from '../../repository/PackageRepository.js';
import { PackageVersionBlockRepository } from '../../repository/PackageVersionBlockRepository.js';
import { PackageVersionDownloadRepository } from '../../repository/PackageVersionDownloadRepository.js';
import { DistRepository } from '../../repository/DistRepository.js';
import { isDuplicateKeyError } from '../../repository/util/ErrorUtil.js';
import { Package } from '../entity/Package.js';
import { PackageVersion } from '../entity/PackageVersion.js';
import { PackageVersionBlock } from '../entity/PackageVersionBlock.js';
import { PackageTag } from '../entity/PackageTag.js';
import { User } from '../entity/User.js';
import { Dist } from '../entity/Dist.js';
import {
PACKAGE_UNPUBLISHED,
PACKAGE_BLOCKED,
@@ -43,12 +49,12 @@ import {
PACKAGE_TAG_CHANGED,
PACKAGE_TAG_REMOVED,
PACKAGE_META_CHANGED,
} from '../event';
import { BugVersionService } from './BugVersionService';
import { BugVersion } from '../entity/BugVersion';
import { RegistryManagerService } from './RegistryManagerService';
import { Registry } from '../entity/Registry';
import { PackageVersionService } from './PackageVersionService';
} from '../event/index.js';
import { BugVersionService } from './BugVersionService.js';
import { BugVersion } from '../entity/BugVersion.js';
import { RegistryManagerService } from './RegistryManagerService.js';
import { Registry } from '../entity/Registry.js';
import { PackageVersionService } from './PackageVersionService.js';
export interface PublishPackageCmd {
// maintainer: Maintainer;
@@ -706,8 +712,8 @@ export class PackageManagerService extends AbstractService {
fullManifests,
abbreviatedManifests,
] = await Promise.all([
await this._listPackageFullManifests(pkg),
await this._listPackageAbbreviatedManifests(pkg),
this._listPackageFullManifests(pkg),
this._listPackageAbbreviatedManifests(pkg),
]);
await this._updatePackageManifestsToDists(pkg, fullManifests, abbreviatedManifests);
}
@@ -998,7 +1004,7 @@ export class PackageManagerService extends AbstractService {
}
const pkgVersion = await this.packageVersionService.getVersion(npa(`${fullname}@${spec}`));
assert(pkgVersion);
} catch (e) {
} catch {
throw new BadRequestError(`deps ${fullname}@${spec} not found`);
}
}, {

View File

@@ -1,14 +1,13 @@
import { AccessLevel, Inject, SingletonProto } from '@eggjs/tegg';
import { estypes, errors } from '@elastic/elasticsearch';
import dayjs from 'dayjs';
import { AbstractService } from '../../common/AbstractService';
import { formatAuthor, getScopeAndName } from '../../common/PackageUtil';
import { PackageManagerService } from './PackageManagerService';
import { SearchManifestType, SearchMappingType, SearchRepository } from '../../repository/SearchRepository';
import { PackageVersionDownloadRepository } from '../../repository/PackageVersionDownloadRepository';
import { PackageRepository } from '../../repository/PackageRepository';
import { PackageVersionBlockRepository } from '../../repository/PackageVersionBlockRepository';
import { AbstractService } from '../../common/AbstractService.js';
import { formatAuthor, getScopeAndName } from '../../common/PackageUtil.js';
import { PackageManagerService } from './PackageManagerService.js';
import { SearchManifestType, SearchMappingType, SearchRepository } from '../../repository/SearchRepository.js';
import { PackageVersionDownloadRepository } from '../../repository/PackageVersionDownloadRepository.js';
import { PackageRepository } from '../../repository/PackageRepository.js';
import { PackageVersionBlockRepository } from '../../repository/PackageVersionBlockRepository.js';
@SingletonProto({
@@ -58,7 +57,7 @@ export class PackageSearchService extends AbstractService {
for (let i = 1; i <= 31; i++) {
const day = String(i).padStart(2, '0');
const field = `d${day}`;
const counter = entity[field];
const counter = entity[field as keyof typeof entity] as number;
if (!counter) continue;
downloadsAll += counter;
}

View File

@@ -8,30 +8,30 @@ import {
} from '@eggjs/tegg';
import { Pointcut } from '@eggjs/tegg/aop';
import { EggHttpClient } from 'egg';
import { isEqual, isEmpty } from 'lodash';
import { isEqual, isEmpty } from 'lodash-es';
import semver from 'semver';
import { NPMRegistry, RegistryResponse } from '../../common/adapter/NPMRegistry';
import { detectInstallScript, getScopeAndName } from '../../common/PackageUtil';
import { downloadToTempfile } from '../../common/FileUtil';
import { TaskState, TaskType } from '../../common/enum/Task';
import { AbstractService } from '../../common/AbstractService';
import { TaskRepository } from '../../repository/TaskRepository';
import { PackageJSONType, PackageManifestType, PackageRepository } from '../../repository/PackageRepository';
import { PackageVersionDownloadRepository } from '../../repository/PackageVersionDownloadRepository';
import { UserRepository } from '../../repository/UserRepository';
import { Task, SyncPackageTaskOptions, CreateSyncPackageTask } from '../entity/Task';
import { Package } from '../entity/Package';
import { UserService } from './UserService';
import { TaskService } from './TaskService';
import { PackageManagerService } from './PackageManagerService';
import { CacheService } from './CacheService';
import { User } from '../entity/User';
import { RegistryManagerService } from './RegistryManagerService';
import { Registry } from '../entity/Registry';
import { BadRequestError } from 'egg-errors';
import { ScopeManagerService } from './ScopeManagerService';
import { EventCorkAdvice } from './EventCorkerAdvice';
import { PresetRegistryName, SyncDeleteMode } from '../../common/constants';
import { NPMRegistry, RegistryResponse } from '../../common/adapter/NPMRegistry.js';
import { detectInstallScript, getScopeAndName } from '../../common/PackageUtil.js';
import { downloadToTempfile } from '../../common/FileUtil.js';
import { TaskState, TaskType } from '../../common/enum/Task.js';
import { AbstractService } from '../../common/AbstractService.js';
import { TaskRepository } from '../../repository/TaskRepository.js';
import { PackageJSONType, PackageManifestType, PackageRepository } from '../../repository/PackageRepository.js';
import { PackageVersionDownloadRepository } from '../../repository/PackageVersionDownloadRepository.js';
import { UserRepository } from '../../repository/UserRepository.js';
import { Task, SyncPackageTaskOptions, CreateSyncPackageTask } from '../entity/Task.js';
import { Package } from '../entity/Package.js';
import { UserService } from './UserService.js';
import { TaskService } from './TaskService.js';
import { PackageManagerService } from './PackageManagerService.js';
import { CacheService } from './CacheService.js';
import { User } from '../entity/User.js';
import { RegistryManagerService } from './RegistryManagerService.js';
import { Registry } from '../entity/Registry.js';
import { ScopeManagerService } from './ScopeManagerService.js';
import { EventCorkAdvice } from './EventCorkerAdvice.js';
import { PresetRegistryName, SyncDeleteMode } from '../../common/constants.js';
type syncDeletePkgOptions = {
task: Task,

View File

@@ -1,6 +1,7 @@
import fs from 'node:fs/promises';
import { join, dirname, basename } from 'node:path';
import { randomUUID } from 'node:crypto';
// @ts-expect-error type error
import tar from '@fengmk2/tar';
import {
AccessLevel,
@@ -9,24 +10,24 @@ import {
} from '@eggjs/tegg';
import { ConflictError, ForbiddenError } from 'egg-errors';
import semver from 'semver';
import { AbstractService } from '../../common/AbstractService';
import { AbstractService } from '../../common/AbstractService.js';
import {
calculateIntegrity,
getFullname,
} from '../../common/PackageUtil';
import { createTempDir, mimeLookup } from '../../common/FileUtil';
} from '../../common/PackageUtil.js';
import { createTempDir, mimeLookup } from '../../common/FileUtil.js';
import {
PackageRepository,
} from '../../repository/PackageRepository';
import { PackageVersionFileRepository } from '../../repository/PackageVersionFileRepository';
import { PackageVersionRepository } from '../../repository/PackageVersionRepository';
import { DistRepository } from '../../repository/DistRepository';
import { isDuplicateKeyError } from '../../repository/util/ErrorUtil';
import { PackageVersionFile } from '../entity/PackageVersionFile';
import { PackageVersion } from '../entity/PackageVersion';
import { Package } from '../entity/Package';
import { PackageManagerService } from './PackageManagerService';
import { CacheAdapter } from '../../common/adapter/CacheAdapter';
} from '../../repository/PackageRepository.js';
import { PackageVersionFileRepository } from '../../repository/PackageVersionFileRepository.js';
import { PackageVersionRepository } from '../../repository/PackageVersionRepository.js';
import { DistRepository } from '../../repository/DistRepository.js';
import { isDuplicateKeyError } from '../../repository/util/ErrorUtil.js';
import { PackageVersionFile } from '../entity/PackageVersionFile.js';
import { PackageVersion } from '../entity/PackageVersion.js';
import { Package } from '../entity/Package.js';
import { PackageManagerService } from './PackageManagerService.js';
import { CacheAdapter } from '../../common/adapter/CacheAdapter.js';
const unpkgWhiteListUrl = 'https://github.com/cnpm/unpkg-white-list';
const CHECK_TIMEOUT = process.env.NODE_ENV === 'test' ? 1 : 60000;
@@ -148,7 +149,7 @@ export class PackageVersionFileService extends AbstractService {
file: tarFile,
cwd: tmpdir,
strip: 1,
onentry: entry => {
onentry: (entry: any) => {
const filename = this.#formatTarEntryFilename(entry);
if (!filename) return;
if (this.#matchReadmeFilename(filename)) {
@@ -204,7 +205,7 @@ export class PackageVersionFileService extends AbstractService {
file: tarFile,
cwd: tmpdir,
strip: 1,
onentry: entry => {
onentry: (entry: any) => {
const filename = this.#formatTarEntryFilename(entry);
if (!filename) return;
paths.push('/' + filename);

View File

@@ -1,14 +1,14 @@
import { AccessLevel, SingletonProto, Inject } from '@eggjs/tegg';
import semver, { Range } from 'semver';
import { Result, AliasResult } from 'npm-package-arg';
import { PackageVersionRepository } from '../../repository/PackageVersionRepository';
import { getScopeAndName } from '../../common/PackageUtil';
import { SqlRange } from '../entity/SqlRange';
import { BugVersionService } from './BugVersionService';
import type { PackageJSONType, PackageRepository } from '../../repository/PackageRepository';
import { DistRepository } from '../../repository/DistRepository';
import { BugVersionAdvice } from '../entity/BugVersion';
import { PackageVersionBlockRepository } from '../../repository/PackageVersionBlockRepository';
import { PackageVersionRepository } from '../../repository/PackageVersionRepository.js';
import { getScopeAndName } from '../../common/PackageUtil.js';
import { SqlRange } from '../entity/SqlRange.js';
import { BugVersionService } from './BugVersionService.js';
import { type PackageJSONType, PackageRepository } from '../../repository/PackageRepository.js';
import { DistRepository } from '../../repository/DistRepository.js';
import { BugVersionAdvice } from '../entity/BugVersion.js';
import { PackageVersionBlockRepository } from '../../repository/PackageVersionBlockRepository.js';
@SingletonProto({
accessLevel: AccessLevel.PUBLIC,

View File

@@ -1,31 +1,32 @@
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';
import { TaskService } from './TaskService';
import { CacheService } from './CacheService';
import { RegistryManagerService } from './RegistryManagerService';
import { NPMRegistry } from '../../common/adapter/NPMRegistry';
import { NFSAdapter } from '../../common/adapter/NFSAdapter';
import { ProxyCache } from '../entity/ProxyCache';
import { Task, UpdateProxyCacheTaskOptions, CreateUpdateProxyCacheTask } from '../entity/Task';
import { ProxyCacheRepository } from '../../repository/ProxyCacheRepository';
import { TaskType, TaskState } from '../../common/enum/Task';
import { calculateIntegrity } from '../../common/PackageUtil';
import { ABBREVIATED_META_TYPE, PROXY_CACHE_DIR_NAME } from '../../common/constants';
import { DIST_NAMES } from '../entity/Package';
import type { AbbreviatedPackageManifestType, AbbreviatedPackageJSONType, PackageManifestType, PackageJSONType } from '../../repository/PackageRepository';
import { AbstractService } from '../../common/AbstractService.js';
import { TaskService } from './TaskService.js';
import { CacheService } from './CacheService.js';
import { RegistryManagerService } from './RegistryManagerService.js';
import { NPMRegistry } from '../../common/adapter/NPMRegistry.js';
import { NFSAdapter } from '../../common/adapter/NFSAdapter.js';
import { ProxyCache } from '../entity/ProxyCache.js';
import { Task, UpdateProxyCacheTaskOptions, CreateUpdateProxyCacheTask } from '../entity/Task.js';
import { ProxyCacheRepository } from '../../repository/ProxyCacheRepository.js';
import { TaskType, TaskState } from '../../common/enum/Task.js';
import { calculateIntegrity } from '../../common/PackageUtil.js';
import { ABBREVIATED_META_TYPE, PROXY_CACHE_DIR_NAME } from '../../common/constants.js';
import { DIST_NAMES, isPkgManifest } from '../entity/Package.js';
import type {
AbbreviatedPackageManifestType,
AbbreviatedPackageJSONType,
PackageManifestType,
PackageJSONType,
} from '../../repository/PackageRepository.js';
function isoNow() {
return new Date().toISOString();
}
export function isPkgManifest(fileType: DIST_NAMES) {
return fileType === DIST_NAMES.FULL_MANIFESTS || fileType === DIST_NAMES.ABBREVIATED_MANIFESTS;
}
type GetSourceManifestAndCacheReturnType<T> = T extends DIST_NAMES.ABBREVIATED | DIST_NAMES.MANIFEST ? AbbreviatedPackageJSONType | PackageJSONType :
T extends DIST_NAMES.FULL_MANIFESTS | DIST_NAMES.ABBREVIATED_MANIFESTS ? AbbreviatedPackageManifestType|PackageManifestType : never;
@@ -51,7 +52,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)}`);
}
@@ -228,11 +229,11 @@ export class ProxyCacheService extends AbstractService {
}
// replace tarball url
const manifest = this.replaceTarballUrl(responseResult.data, fileType);
const manifest = this.replaceTarballUrl(responseResult!.data, fileType);
return manifest;
}
private async storeRewrittenManifest(manifest, fullname: string, fileType: DIST_NAMES) {
private async storeRewrittenManifest(manifest: any, fullname: string, fileType: DIST_NAMES) {
let storeKey: string;
if (isPkgManifest(fileType)) {
storeKey = `/${PROXY_CACHE_DIR_NAME}/${fullname}/${fileType}`;
@@ -244,7 +245,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

@@ -4,15 +4,15 @@ import {
Inject,
} from '@eggjs/tegg';
import { E400, NotFoundError } from 'egg-errors';
import { RegistryRepository } from '../../repository/RegistryRepository';
import { AbstractService } from '../../common/AbstractService';
import { Registry } from '../entity/Registry';
import { PageOptions, PageResult } from '../util/EntityUtil';
import { ScopeManagerService } from './ScopeManagerService';
import { TaskService } from './TaskService';
import { Task } from '../entity/Task';
import { ChangesStreamMode, PresetRegistryName } from '../../common/constants';
import { RegistryType } from '../../common/enum/Registry';
import { RegistryRepository } from '../../repository/RegistryRepository.js';
import { AbstractService } from '../../common/AbstractService.js';
import { Registry } from '../entity/Registry.js';
import { PageOptions, PageResult } from '../util/EntityUtil.js';
import { ScopeManagerService } from './ScopeManagerService.js';
import { TaskService } from './TaskService.js';
import { Task } from '../entity/Task.js';
import { ChangesStreamMode, PresetRegistryName } from '../../common/constants.js';
import { RegistryType } from '../../common/enum/Registry.js';
export interface CreateRegistryCmd extends Pick<Registry, 'changeStream' | 'host' | 'userPrefix' | 'type' | 'name' | 'authToken' > {
operatorId?: string;

View File

@@ -3,10 +3,10 @@ import {
SingletonProto,
Inject,
} from '@eggjs/tegg';
import { ScopeRepository } from '../../repository/ScopeRepository';
import { AbstractService } from '../../common/AbstractService';
import { Scope } from '../entity/Scope';
import { PageOptions, PageResult } from '../util/EntityUtil';
import { ScopeRepository } from '../../repository/ScopeRepository.js';
import { AbstractService } from '../../common/AbstractService.js';
import { Scope } from '../entity/Scope.js';
import { PageOptions, PageResult } from '../util/EntityUtil.js';
export interface CreateScopeCmd extends Pick<Scope, 'name' | 'registryId'> {
operatorId?: string;

View File

@@ -3,12 +3,12 @@ import {
SingletonProto,
Inject,
} from '@eggjs/tegg';
import { NFSAdapter } from '../../common/adapter/NFSAdapter';
import { TaskState, TaskType } from '../../common/enum/Task';
import { AbstractService } from '../../common/AbstractService';
import { TaskRepository } from '../../repository/TaskRepository';
import { Task, CreateSyncPackageTaskData } from '../entity/Task';
import { QueueAdapter } from '../../common/typing';
import { NFSAdapter } from '../../common/adapter/NFSAdapter.js';
import { TaskState, TaskType } from '../../common/enum/Task.js';
import { AbstractService } from '../../common/AbstractService.js';
import { TaskRepository } from '../../repository/TaskRepository.js';
import { Task, CreateSyncPackageTaskData } from '../entity/Task.js';
import { QueueAdapter } from '../../common/typing.js';
@SingletonProto({
accessLevel: AccessLevel.PUBLIC,
@@ -144,6 +144,7 @@ export class TaskService extends AbstractService {
this.logger.error(
'[TaskService.retryExecuteTimeoutTasks:error] processing task, taskType: %s, targetName: %s, taskId: %s, attempts %s will retry again',
task.type, task.targetName, task.taskId, task.attempts);
this.logger.error(e);
}
}
// try waiting timeout tasks in 30 mins
@@ -158,6 +159,7 @@ export class TaskService extends AbstractService {
this.logger.error(
'[TaskService.retryExecuteTimeoutTasks:error] waiting task, taskType: %s, targetName: %s, taskId: %s, attempts %s will retry again',
task.type, task.targetName, task.taskId, task.attempts);
this.logger.error(e);
}
}
return {

View File

@@ -4,17 +4,17 @@ import {
SingletonProto,
Inject,
} from '@eggjs/tegg';
import { isEmpty } from 'lodash';
import { AbstractService } from '../../common/AbstractService';
import { Token, isGranularToken } from '../entity/Token';
import { TokenPackage as TokenPackageModel } from '../../../app/repository/model/TokenPackage';
import { Package as PackageModel } from '../../../app/repository/model/Package';
import { ModelConvertor } from '../../../app/repository/util/ModelConvertor';
import { Package as PackageEntity } from '../entity/Package';
import { isEmpty } from 'lodash-es';
import { ForbiddenError, UnauthorizedError } from 'egg-errors';
import { getScopeAndName } from '../../../app/common/PackageUtil';
import { sha512 } from '../../../app/common/UserUtil';
import { UserRepository } from '../../../app/repository/UserRepository';
import { AbstractService } from '../../common/AbstractService.js';
import { Token, isGranularToken } from '../entity/Token.js';
import { TokenPackage as TokenPackageModel } from '../../../app/repository/model/TokenPackage.js';
import { Package as PackageModel } from '../../../app/repository/model/Package.js';
import { ModelConvertor } from '../../../app/repository/util/ModelConvertor.js';
import { Package as PackageEntity } from '../entity/Package.js';
import { getScopeAndName } from '../../../app/common/PackageUtil.js';
import { sha512 } from '../../../app/common/UserUtil.js';
import { UserRepository } from '../../../app/repository/UserRepository.js';
@SingletonProto({
accessLevel: AccessLevel.PUBLIC,
@@ -73,7 +73,7 @@ export class TokenService extends AbstractService {
async getUserAndToken(authorization: string) {
if (!authorization) return null;
const matchs = /^Bearer ([\w\.]+?)$/.exec(authorization);
const matchs = /^Bearer ([\w.]+?)$/.exec(authorization);
if (!matchs) return null;
const tokenValue = matchs[1];
const tokenKey = sha512(tokenValue);

View File

@@ -1,20 +1,20 @@
import crypto from 'crypto';
import crypto from 'node:crypto';
import {
AccessLevel,
SingletonProto,
Inject,
} from '@eggjs/tegg';
import { NotFoundError, ForbiddenError } from 'egg-errors';
import { UserRepository } from '../../repository/UserRepository';
import { User as UserEntity } from '../entity/User';
import { Token as TokenEntity, TokenType } from '../entity/Token';
import { WebauthnCredential as WebauthnCredentialEntity } from '../entity/WebauthnCredential';
import { LoginResultCode } from '../../common/enum/User';
import { integrity, checkIntegrity, randomToken, sha512 } from '../../common/UserUtil';
import { AbstractService } from '../../common/AbstractService';
import { RegistryManagerService } from './RegistryManagerService';
import { getPrefixedName } from '../../common/PackageUtil';
import { Registry } from '../entity/Registry';
import { UserRepository } from '../../repository/UserRepository.js';
import { User as UserEntity } from '../entity/User.js';
import { Token as TokenEntity, TokenType } from '../entity/Token.js';
import { WebauthnCredential as WebauthnCredentialEntity } from '../entity/WebauthnCredential.js';
import { LoginResultCode } from '../../common/enum/User.js';
import { integrity, checkIntegrity, randomToken, sha512 } from '../../common/UserUtil.js';
import { AbstractService } from '../../common/AbstractService.js';
import { RegistryManagerService } from './RegistryManagerService.js';
import { getPrefixedName } from '../../common/PackageUtil.js';
import { Registry } from '../entity/Registry.js';
type Optional<T, K extends keyof T> = Omit < T, K > & Partial<T> ;

View File

@@ -1,6 +1,7 @@
import ObjectID from 'bson-objectid';
import { E400 } from 'egg-errors';
import { EntityData } from '../entity/Entity';
import { EntityData } from '../entity/Entity.js';
type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
@@ -29,6 +30,7 @@ export class EntityUtil {
}
static createId(): string {
// @ts-expect-error ObjectID has no construct signatures
return new ObjectID().toHexString();
}

View File

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

View File

@@ -1,3 +1,4 @@
import { Readable } from 'node:stream';
import {
AccessLevel,
LifecycleInit,
@@ -6,8 +7,8 @@ import {
} from '@eggjs/tegg';
import { EggAppConfig, EggLogger } from 'egg';
import FSClient from 'fs-cnpm';
import { AppendResult, NFSClient, UploadOptions, UploadResult, DownloadOptions } from '../common/typing';
import { Readable } from 'stream';
import { AppendResult, NFSClient, UploadOptions, UploadResult, DownloadOptions } from '../common/typing.js';
@SingletonProto({
name: 'nfsClient',
@@ -68,10 +69,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

@@ -4,7 +4,8 @@ import {
SingletonProto,
} from '@eggjs/tegg';
import { Redis } from 'ioredis';
import { QueueAdapter } from '../common/typing';
import { QueueAdapter } from '../common/typing.js';
/**
* Use sort set to keep queue in order and keep same value only insert once

View File

@@ -4,9 +4,9 @@ import {
SingletonProto,
} from '@eggjs/tegg';
import { EggAppConfig } from 'egg';
import { Client as ElasticsearchClient, estypes } from '@elastic/elasticsearch';
import { SearchAdapter } from '../common/typing';
import { SearchAdapter } from '../common/typing.js';
/**
* Use elasticsearch to search the huge npm packages.

View File

@@ -2,5 +2,6 @@
"name": "cnpmcore-infra",
"eggModule": {
"name": "cnpmcoreInfra"
}
},
"type": "module"
}

View File

@@ -6,13 +6,14 @@ import {
} from '@eggjs/tegg';
import { EggAppConfig, EggLogger } from 'egg';
import { UnauthorizedError, ForbiddenError } from 'egg-errors';
import { PackageRepository } from '../repository/PackageRepository';
import { Package as PackageEntity } from '../core/entity/Package';
import { User as UserEntity } from '../core/entity/User';
import { Token as TokenEntity } from '../core/entity/Token';
import { getScopeAndName } from '../common/PackageUtil';
import { RegistryManagerService } from '../core/service/RegistryManagerService';
import { TokenService } from '../core/service/TokenService';
import { PackageRepository } from '../repository/PackageRepository.js';
import { Package as PackageEntity } from '../core/entity/Package.js';
import { User as UserEntity } from '../core/entity/User.js';
import { Token as TokenEntity } from '../core/entity/Token.js';
import { getScopeAndName } from '../common/PackageUtil.js';
import { RegistryManagerService } from '../core/service/RegistryManagerService.js';
import { TokenService } from '../core/service/TokenService.js';
// https://docs.npmjs.com/creating-and-viewing-access-tokens#creating-tokens-on-the-website
export type TokenRole = 'read' | 'publish' | 'setting';
@@ -72,7 +73,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 +106,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) {

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