Merge branch 'next' into merge-next
This commit is contained in:
36
.docker/alpine/Dockerfile
Normal file
36
.docker/alpine/Dockerfile
Normal 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
6
.docker/build.sh
Normal 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
36
.docker/debian/Dockerfile
Normal 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"]
|
||||
41
.env.example
41
.env.example
@@ -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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"extends": "eslint-config-egg/typescript",
|
||||
"rules": {
|
||||
|
||||
}
|
||||
"extends": [
|
||||
"eslint-config-egg/typescript",
|
||||
"eslint-config-egg/lib/rules/enforce-node-prefix"
|
||||
]
|
||||
}
|
||||
|
||||
75
.github/workflows/nodejs.yml
vendored
75
.github/workflows/nodejs.yml
vendored
@@ -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 }}
|
||||
|
||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -1,7 +1,7 @@
|
||||
name: Release
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
branches: [ master, next ]
|
||||
|
||||
jobs:
|
||||
release:
|
||||
|
||||
6
.oxlintrc.json
Normal file
6
.oxlintrc.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"plugins": ["import"],
|
||||
"rules": {
|
||||
"import/no-cycle": "error"
|
||||
}
|
||||
}
|
||||
27
CHANGELOG.md
27
CHANGELOG.md
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
17
Dockerfile
17
Dockerfile
@@ -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"]
|
||||
@@ -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
12
app.ts
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { generateKeyPairSync } from 'crypto';
|
||||
import { generateKeyPairSync } from 'node:crypto';
|
||||
import NodeRSA from 'node-rsa';
|
||||
|
||||
// generate rsa key pair
|
||||
|
||||
@@ -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}`);
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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'));
|
||||
}
|
||||
},
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
@@ -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'];
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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/';
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -2,5 +2,6 @@
|
||||
"name": "cnpmcore-common",
|
||||
"eggModule": {
|
||||
"name": "cnpmcoreCommon"
|
||||
}
|
||||
},
|
||||
"type": "module"
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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'>;
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { HookEventType } from '../../common/enum/Hook';
|
||||
import { HookEventType } from '../../common/enum/Hook.js';
|
||||
|
||||
export interface PublishChangePayload {
|
||||
'dist-tag'?: string;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Range, Comparator } from 'semver';
|
||||
import { PaddingSemVer } from './PaddingSemVer';
|
||||
import { PaddingSemVer } from './PaddingSemVer.js';
|
||||
|
||||
const OPERATOR_MAP = {
|
||||
'<': '$lt',
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -2,5 +2,6 @@
|
||||
"name": "cnpmcore-core",
|
||||
"eggModule": {
|
||||
"name": "cnpmcoreCore"
|
||||
}
|
||||
},
|
||||
"type": "module"
|
||||
}
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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}`;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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`);
|
||||
}
|
||||
}, {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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> ;
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -2,5 +2,6 @@
|
||||
"name": "cnpmcore-infra",
|
||||
"eggModule": {
|
||||
"name": "cnpmcoreInfra"
|
||||
}
|
||||
},
|
||||
"type": "module"
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user