pnpm-catalog-updates 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +335 -0
- package/bin/pcu.js +15 -0
- package/dist/application/services/CatalogUpdateService.d.ts +190 -0
- package/dist/application/services/CatalogUpdateService.d.ts.map +1 -0
- package/dist/application/services/CatalogUpdateService.js +521 -0
- package/dist/application/services/CatalogUpdateService.js.map +1 -0
- package/dist/application/services/WorkspaceService.d.ts +139 -0
- package/dist/application/services/WorkspaceService.d.ts.map +1 -0
- package/dist/application/services/WorkspaceService.js +340 -0
- package/dist/application/services/WorkspaceService.js.map +1 -0
- package/dist/cli/commands/CheckCommand.d.ts +41 -0
- package/dist/cli/commands/CheckCommand.d.ts.map +1 -0
- package/dist/cli/commands/CheckCommand.js +168 -0
- package/dist/cli/commands/CheckCommand.js.map +1 -0
- package/dist/cli/commands/UpdateCommand.d.ts +69 -0
- package/dist/cli/commands/UpdateCommand.d.ts.map +1 -0
- package/dist/cli/commands/UpdateCommand.js +361 -0
- package/dist/cli/commands/UpdateCommand.js.map +1 -0
- package/dist/cli/formatters/OutputFormatter.d.ts +95 -0
- package/dist/cli/formatters/OutputFormatter.d.ts.map +1 -0
- package/dist/cli/formatters/OutputFormatter.js +437 -0
- package/dist/cli/formatters/OutputFormatter.js.map +1 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +244 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/options/GlobalOptions.d.ts +117 -0
- package/dist/cli/options/GlobalOptions.d.ts.map +1 -0
- package/dist/cli/options/GlobalOptions.js +278 -0
- package/dist/cli/options/GlobalOptions.js.map +1 -0
- package/dist/cli/options/index.d.ts +5 -0
- package/dist/cli/options/index.d.ts.map +1 -0
- package/dist/cli/options/index.js +5 -0
- package/dist/cli/options/index.js.map +1 -0
- package/dist/cli/validators/CommandValidator.d.ts +60 -0
- package/dist/cli/validators/CommandValidator.d.ts.map +1 -0
- package/dist/cli/validators/CommandValidator.js +319 -0
- package/dist/cli/validators/CommandValidator.js.map +1 -0
- package/dist/cli/validators/index.d.ts +5 -0
- package/dist/cli/validators/index.d.ts.map +1 -0
- package/dist/cli/validators/index.js +5 -0
- package/dist/cli/validators/index.js.map +1 -0
- package/dist/common/config/Config.d.ts +142 -0
- package/dist/common/config/Config.d.ts.map +1 -0
- package/dist/common/config/Config.js +355 -0
- package/dist/common/config/Config.js.map +1 -0
- package/dist/common/config/index.d.ts +6 -0
- package/dist/common/config/index.d.ts.map +1 -0
- package/dist/common/config/index.js +6 -0
- package/dist/common/config/index.js.map +1 -0
- package/dist/common/logger/Logger.d.ts +110 -0
- package/dist/common/logger/Logger.d.ts.map +1 -0
- package/dist/common/logger/Logger.js +289 -0
- package/dist/common/logger/Logger.js.map +1 -0
- package/dist/common/logger/index.d.ts +6 -0
- package/dist/common/logger/index.d.ts.map +1 -0
- package/dist/common/logger/index.js +6 -0
- package/dist/common/logger/index.js.map +1 -0
- package/dist/common/types/cli.d.ts +265 -0
- package/dist/common/types/cli.d.ts.map +1 -0
- package/dist/common/types/cli.js +5 -0
- package/dist/common/types/cli.js.map +1 -0
- package/dist/common/types/core.d.ts +270 -0
- package/dist/common/types/core.d.ts.map +1 -0
- package/dist/common/types/core.js +32 -0
- package/dist/common/types/core.js.map +1 -0
- package/dist/common/types/index.d.ts +8 -0
- package/dist/common/types/index.d.ts.map +1 -0
- package/dist/common/types/index.js +8 -0
- package/dist/common/types/index.js.map +1 -0
- package/dist/common/utils/async.d.ts +74 -0
- package/dist/common/utils/async.d.ts.map +1 -0
- package/dist/common/utils/async.js +228 -0
- package/dist/common/utils/async.js.map +1 -0
- package/dist/common/utils/format.d.ts +32 -0
- package/dist/common/utils/format.d.ts.map +1 -0
- package/dist/common/utils/format.js +121 -0
- package/dist/common/utils/format.js.map +1 -0
- package/dist/common/utils/git.d.ts +44 -0
- package/dist/common/utils/git.d.ts.map +1 -0
- package/dist/common/utils/git.js +147 -0
- package/dist/common/utils/git.js.map +1 -0
- package/dist/common/utils/index.d.ts +11 -0
- package/dist/common/utils/index.d.ts.map +1 -0
- package/dist/common/utils/index.js +11 -0
- package/dist/common/utils/index.js.map +1 -0
- package/dist/common/utils/string.d.ts +56 -0
- package/dist/common/utils/string.d.ts.map +1 -0
- package/dist/common/utils/string.js +134 -0
- package/dist/common/utils/string.js.map +1 -0
- package/dist/common/utils/validation.d.ts +88 -0
- package/dist/common/utils/validation.d.ts.map +1 -0
- package/dist/common/utils/validation.js +281 -0
- package/dist/common/utils/validation.js.map +1 -0
- package/dist/domain/entities/Catalog.d.ts +117 -0
- package/dist/domain/entities/Catalog.d.ts.map +1 -0
- package/dist/domain/entities/Catalog.js +240 -0
- package/dist/domain/entities/Catalog.js.map +1 -0
- package/dist/domain/entities/Package.d.ts +142 -0
- package/dist/domain/entities/Package.d.ts.map +1 -0
- package/dist/domain/entities/Package.js +275 -0
- package/dist/domain/entities/Package.js.map +1 -0
- package/dist/domain/entities/Workspace.d.ts +95 -0
- package/dist/domain/entities/Workspace.d.ts.map +1 -0
- package/dist/domain/entities/Workspace.js +170 -0
- package/dist/domain/entities/Workspace.js.map +1 -0
- package/dist/domain/repositories/WorkspaceRepository.d.ts +41 -0
- package/dist/domain/repositories/WorkspaceRepository.d.ts.map +1 -0
- package/dist/domain/repositories/WorkspaceRepository.js +8 -0
- package/dist/domain/repositories/WorkspaceRepository.js.map +1 -0
- package/dist/domain/value-objects/CatalogCollection.d.ts +106 -0
- package/dist/domain/value-objects/CatalogCollection.d.ts.map +1 -0
- package/dist/domain/value-objects/CatalogCollection.js +230 -0
- package/dist/domain/value-objects/CatalogCollection.js.map +1 -0
- package/dist/domain/value-objects/PackageCollection.d.ts +122 -0
- package/dist/domain/value-objects/PackageCollection.d.ts.map +1 -0
- package/dist/domain/value-objects/PackageCollection.js +263 -0
- package/dist/domain/value-objects/PackageCollection.js.map +1 -0
- package/dist/domain/value-objects/Version.d.ts +141 -0
- package/dist/domain/value-objects/Version.d.ts.map +1 -0
- package/dist/domain/value-objects/Version.js +268 -0
- package/dist/domain/value-objects/Version.js.map +1 -0
- package/dist/domain/value-objects/WorkspaceConfig.d.ts +135 -0
- package/dist/domain/value-objects/WorkspaceConfig.d.ts.map +1 -0
- package/dist/domain/value-objects/WorkspaceConfig.js +307 -0
- package/dist/domain/value-objects/WorkspaceConfig.js.map +1 -0
- package/dist/domain/value-objects/WorkspaceId.d.ts +51 -0
- package/dist/domain/value-objects/WorkspaceId.d.ts.map +1 -0
- package/dist/domain/value-objects/WorkspaceId.js +104 -0
- package/dist/domain/value-objects/WorkspaceId.js.map +1 -0
- package/dist/domain/value-objects/WorkspacePath.d.ts +75 -0
- package/dist/domain/value-objects/WorkspacePath.d.ts.map +1 -0
- package/dist/domain/value-objects/WorkspacePath.js +128 -0
- package/dist/domain/value-objects/WorkspacePath.js.map +1 -0
- package/dist/infrastructure/cache/Cache.d.ts +161 -0
- package/dist/infrastructure/cache/Cache.d.ts.map +1 -0
- package/dist/infrastructure/cache/Cache.js +398 -0
- package/dist/infrastructure/cache/Cache.js.map +1 -0
- package/dist/infrastructure/cache/index.d.ts +6 -0
- package/dist/infrastructure/cache/index.d.ts.map +1 -0
- package/dist/infrastructure/cache/index.js +6 -0
- package/dist/infrastructure/cache/index.js.map +1 -0
- package/dist/infrastructure/external-services/NpmRegistryService.d.ts +106 -0
- package/dist/infrastructure/external-services/NpmRegistryService.d.ts.map +1 -0
- package/dist/infrastructure/external-services/NpmRegistryService.js +303 -0
- package/dist/infrastructure/external-services/NpmRegistryService.js.map +1 -0
- package/dist/infrastructure/file-system/FileSystemService.d.ts +100 -0
- package/dist/infrastructure/file-system/FileSystemService.d.ts.map +1 -0
- package/dist/infrastructure/file-system/FileSystemService.js +284 -0
- package/dist/infrastructure/file-system/FileSystemService.js.map +1 -0
- package/dist/infrastructure/repositories/FileWorkspaceRepository.d.ts +57 -0
- package/dist/infrastructure/repositories/FileWorkspaceRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/FileWorkspaceRepository.js +179 -0
- package/dist/infrastructure/repositories/FileWorkspaceRepository.js.map +1 -0
- package/package.json +125 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NPM Registry Service
|
|
3
|
+
*
|
|
4
|
+
* Provides access to NPM registry for package version information.
|
|
5
|
+
* Handles API calls, caching, and version resolution.
|
|
6
|
+
*/
|
|
7
|
+
import { Version, VersionRange } from '../../domain/value-objects/Version.js';
|
|
8
|
+
export interface PackageInfo {
|
|
9
|
+
name: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
homepage?: string;
|
|
12
|
+
repository?: {
|
|
13
|
+
type: string;
|
|
14
|
+
url: string;
|
|
15
|
+
};
|
|
16
|
+
license?: string;
|
|
17
|
+
author?: string | {
|
|
18
|
+
name: string;
|
|
19
|
+
email?: string;
|
|
20
|
+
};
|
|
21
|
+
maintainers?: Array<{
|
|
22
|
+
name: string;
|
|
23
|
+
email?: string;
|
|
24
|
+
}>;
|
|
25
|
+
keywords?: string[];
|
|
26
|
+
versions: string[];
|
|
27
|
+
latestVersion: string;
|
|
28
|
+
tags: Record<string, string>;
|
|
29
|
+
time: Record<string, string>;
|
|
30
|
+
}
|
|
31
|
+
export interface SecurityVulnerability {
|
|
32
|
+
id: string;
|
|
33
|
+
title: string;
|
|
34
|
+
severity: 'low' | 'moderate' | 'high' | 'critical';
|
|
35
|
+
description: string;
|
|
36
|
+
reference: string;
|
|
37
|
+
vulnerable_versions: string;
|
|
38
|
+
patched_versions?: string;
|
|
39
|
+
recommendation?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface SecurityReport {
|
|
42
|
+
package: string;
|
|
43
|
+
version: string;
|
|
44
|
+
vulnerabilities: SecurityVulnerability[];
|
|
45
|
+
hasVulnerabilities: boolean;
|
|
46
|
+
}
|
|
47
|
+
export declare class NpmRegistryService {
|
|
48
|
+
private readonly registryUrl;
|
|
49
|
+
private readonly timeout;
|
|
50
|
+
private readonly cache;
|
|
51
|
+
private readonly cacheTimeout;
|
|
52
|
+
constructor(registryUrl?: string, timeout?: number);
|
|
53
|
+
/**
|
|
54
|
+
* Get package information including all versions
|
|
55
|
+
*/
|
|
56
|
+
getPackageInfo(packageName: string): Promise<PackageInfo>;
|
|
57
|
+
/**
|
|
58
|
+
* Get the latest version of a package
|
|
59
|
+
*/
|
|
60
|
+
getLatestVersion(packageName: string): Promise<Version>;
|
|
61
|
+
/**
|
|
62
|
+
* Get the greatest version that satisfies a range
|
|
63
|
+
*/
|
|
64
|
+
getGreatestVersion(packageName: string, range?: VersionRange): Promise<Version>;
|
|
65
|
+
/**
|
|
66
|
+
* Get versions by date (newest versions published)
|
|
67
|
+
*/
|
|
68
|
+
getNewestVersions(packageName: string, count?: number): Promise<Version[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Check for security vulnerabilities
|
|
71
|
+
*/
|
|
72
|
+
checkSecurityVulnerabilities(packageName: string, version: string): Promise<SecurityReport>;
|
|
73
|
+
/**
|
|
74
|
+
* Batch query multiple packages
|
|
75
|
+
*/
|
|
76
|
+
batchQueryVersions(packages: string[]): Promise<Map<string, PackageInfo>>;
|
|
77
|
+
/**
|
|
78
|
+
* Check if package author has changed
|
|
79
|
+
*/
|
|
80
|
+
hasPackageAuthorChanged(packageName: string, fromVersion: string, toVersion: string): Promise<boolean>;
|
|
81
|
+
/**
|
|
82
|
+
* Get package download statistics
|
|
83
|
+
*/
|
|
84
|
+
getDownloadStats(packageName: string, period?: 'last-day' | 'last-week' | 'last-month'): Promise<number>;
|
|
85
|
+
/**
|
|
86
|
+
* Clear cache
|
|
87
|
+
*/
|
|
88
|
+
clearCache(): void;
|
|
89
|
+
/**
|
|
90
|
+
* Get item from cache if not expired
|
|
91
|
+
*/
|
|
92
|
+
private getFromCache;
|
|
93
|
+
/**
|
|
94
|
+
* Set item in cache
|
|
95
|
+
*/
|
|
96
|
+
private setCache;
|
|
97
|
+
/**
|
|
98
|
+
* Split array into chunks
|
|
99
|
+
*/
|
|
100
|
+
private chunkArray;
|
|
101
|
+
/**
|
|
102
|
+
* Normalize author for comparison
|
|
103
|
+
*/
|
|
104
|
+
private normalizeAuthor;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=NpmRegistryService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NpmRegistryService.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/external-services/NpmRegistryService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,qBAAqB,EAAE,CAAC;IACzC,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,qBAAa,kBAAkB;IAK3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4D;IAClF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;gBAGnC,WAAW,GAAE,MAAsC,EACnD,OAAO,GAAE,MAAc;IAG1C;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA2C/D;;OAEG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS7D;;OAEG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAgCrF;;OAEG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAmBpF;;OAEG;IACG,4BAA4B,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,CAAC;IAyE1B;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAuB/E;;OAEG;IACG,uBAAuB,CAC3B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC;IAyBnB;;OAEG;IACG,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,UAAU,GAAG,WAAW,GAAG,YAA0B,GAC5D,OAAO,CAAC,MAAM,CAAC;IAalB;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACH,OAAO,CAAC,eAAe;CASxB"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NPM Registry Service
|
|
3
|
+
*
|
|
4
|
+
* Provides access to NPM registry for package version information.
|
|
5
|
+
* Handles API calls, caching, and version resolution.
|
|
6
|
+
*/
|
|
7
|
+
import npmRegistryFetch from 'npm-registry-fetch';
|
|
8
|
+
import pacote from 'pacote';
|
|
9
|
+
import semver from 'semver';
|
|
10
|
+
import fetch from 'node-fetch';
|
|
11
|
+
import { Version } from '../../domain/value-objects/Version.js';
|
|
12
|
+
export class NpmRegistryService {
|
|
13
|
+
registryUrl;
|
|
14
|
+
timeout;
|
|
15
|
+
cache = new Map();
|
|
16
|
+
cacheTimeout = 5 * 60 * 1000; // 5 minutes
|
|
17
|
+
constructor(registryUrl = 'https://registry.npmjs.org/', timeout = 30000) {
|
|
18
|
+
this.registryUrl = registryUrl;
|
|
19
|
+
this.timeout = timeout;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get package information including all versions
|
|
23
|
+
*/
|
|
24
|
+
async getPackageInfo(packageName) {
|
|
25
|
+
const cacheKey = `package-info:${packageName}`;
|
|
26
|
+
// Check cache first
|
|
27
|
+
const cached = this.getFromCache(cacheKey);
|
|
28
|
+
if (cached) {
|
|
29
|
+
return cached;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const packument = await pacote.packument(packageName, {
|
|
33
|
+
registry: this.registryUrl,
|
|
34
|
+
timeout: this.timeout,
|
|
35
|
+
fullMetadata: true,
|
|
36
|
+
});
|
|
37
|
+
const versions = Object.keys(packument.versions || {}).sort(semver.rcompare);
|
|
38
|
+
const latestVersion = packument['dist-tags']?.latest || versions[0];
|
|
39
|
+
const packageInfo = {
|
|
40
|
+
name: packument.name,
|
|
41
|
+
description: packument.description,
|
|
42
|
+
homepage: packument.homepage,
|
|
43
|
+
repository: packument.repository,
|
|
44
|
+
license: packument.license,
|
|
45
|
+
author: packument.author,
|
|
46
|
+
maintainers: packument.maintainers,
|
|
47
|
+
keywords: packument.keywords,
|
|
48
|
+
versions,
|
|
49
|
+
latestVersion,
|
|
50
|
+
tags: packument['dist-tags'] || {},
|
|
51
|
+
time: packument.time || {},
|
|
52
|
+
};
|
|
53
|
+
// Cache the result
|
|
54
|
+
this.setCache(cacheKey, packageInfo);
|
|
55
|
+
return packageInfo;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
throw new Error(`Failed to fetch package info for ${packageName}: ${error}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get the latest version of a package
|
|
63
|
+
*/
|
|
64
|
+
async getLatestVersion(packageName) {
|
|
65
|
+
try {
|
|
66
|
+
const packageInfo = await this.getPackageInfo(packageName);
|
|
67
|
+
return Version.fromString(packageInfo.latestVersion);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
throw new Error(`Failed to get latest version for ${packageName}: ${error}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get the greatest version that satisfies a range
|
|
75
|
+
*/
|
|
76
|
+
async getGreatestVersion(packageName, range) {
|
|
77
|
+
try {
|
|
78
|
+
const packageInfo = await this.getPackageInfo(packageName);
|
|
79
|
+
if (!range) {
|
|
80
|
+
return Version.fromString(packageInfo.latestVersion);
|
|
81
|
+
}
|
|
82
|
+
// Find the greatest version that satisfies the range
|
|
83
|
+
const satisfyingVersions = packageInfo.versions.filter((v) => {
|
|
84
|
+
try {
|
|
85
|
+
const version = Version.fromString(v);
|
|
86
|
+
return version.satisfies(range);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
if (satisfyingVersions.length === 0) {
|
|
93
|
+
throw new Error(`No versions satisfy range ${range.toString()}`);
|
|
94
|
+
}
|
|
95
|
+
// Return the first (greatest) version
|
|
96
|
+
if (!satisfyingVersions[0]) {
|
|
97
|
+
throw new Error(`No satisfying versions found for ${packageName}`);
|
|
98
|
+
}
|
|
99
|
+
return Version.fromString(satisfyingVersions[0]);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
throw new Error(`Failed to get greatest version for ${packageName}: ${error}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get versions by date (newest versions published)
|
|
107
|
+
*/
|
|
108
|
+
async getNewestVersions(packageName, count = 10) {
|
|
109
|
+
try {
|
|
110
|
+
const packageInfo = await this.getPackageInfo(packageName);
|
|
111
|
+
// Sort versions by publication time
|
|
112
|
+
const versionsWithTime = packageInfo.versions
|
|
113
|
+
.map((version) => ({
|
|
114
|
+
version,
|
|
115
|
+
time: packageInfo.time[version] ? new Date(packageInfo.time[version]) : new Date(0),
|
|
116
|
+
}))
|
|
117
|
+
.sort((a, b) => b.time.getTime() - a.time.getTime())
|
|
118
|
+
.slice(0, count);
|
|
119
|
+
return versionsWithTime.map((item) => Version.fromString(item.version));
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
throw new Error(`Failed to get newest versions for ${packageName}: ${error}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Check for security vulnerabilities
|
|
127
|
+
*/
|
|
128
|
+
async checkSecurityVulnerabilities(packageName, version) {
|
|
129
|
+
const cacheKey = `security:${packageName}@${version}`;
|
|
130
|
+
// Check cache first
|
|
131
|
+
const cached = this.getFromCache(cacheKey);
|
|
132
|
+
if (cached) {
|
|
133
|
+
return cached;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
// Use npm audit API
|
|
137
|
+
const auditData = {
|
|
138
|
+
name: packageName,
|
|
139
|
+
version: version,
|
|
140
|
+
requires: {},
|
|
141
|
+
dependencies: {},
|
|
142
|
+
};
|
|
143
|
+
const response = await npmRegistryFetch('/-/npm/v1/security/audits', {
|
|
144
|
+
method: 'POST',
|
|
145
|
+
body: JSON.stringify(auditData),
|
|
146
|
+
headers: {
|
|
147
|
+
'Content-Type': 'application/json',
|
|
148
|
+
},
|
|
149
|
+
registry: this.registryUrl,
|
|
150
|
+
timeout: this.timeout,
|
|
151
|
+
});
|
|
152
|
+
const auditResult = await response.json();
|
|
153
|
+
const vulnerabilities = [];
|
|
154
|
+
// Parse audit results
|
|
155
|
+
if (auditResult.advisories) {
|
|
156
|
+
for (const advisory of Object.values(auditResult.advisories)) {
|
|
157
|
+
vulnerabilities.push({
|
|
158
|
+
id: advisory.id.toString(),
|
|
159
|
+
title: advisory.title,
|
|
160
|
+
severity: advisory.severity,
|
|
161
|
+
description: advisory.overview,
|
|
162
|
+
reference: advisory.url,
|
|
163
|
+
vulnerable_versions: advisory.vulnerable_versions,
|
|
164
|
+
patched_versions: advisory.patched_versions,
|
|
165
|
+
recommendation: advisory.recommendation,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const securityReport = {
|
|
170
|
+
package: packageName,
|
|
171
|
+
version: version,
|
|
172
|
+
vulnerabilities,
|
|
173
|
+
hasVulnerabilities: vulnerabilities.length > 0,
|
|
174
|
+
};
|
|
175
|
+
// Cache the result
|
|
176
|
+
this.setCache(cacheKey, securityReport);
|
|
177
|
+
return securityReport;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
// If security check fails, return empty report
|
|
181
|
+
console.warn(`Security check failed for ${packageName}@${version}:`, error);
|
|
182
|
+
const emptyReport = {
|
|
183
|
+
package: packageName,
|
|
184
|
+
version: version,
|
|
185
|
+
vulnerabilities: [],
|
|
186
|
+
hasVulnerabilities: false,
|
|
187
|
+
};
|
|
188
|
+
return emptyReport;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Batch query multiple packages
|
|
193
|
+
*/
|
|
194
|
+
async batchQueryVersions(packages) {
|
|
195
|
+
const results = new Map();
|
|
196
|
+
// Process packages in parallel with limited concurrency
|
|
197
|
+
const concurrency = 5;
|
|
198
|
+
const chunks = this.chunkArray(packages, concurrency);
|
|
199
|
+
for (const chunk of chunks) {
|
|
200
|
+
const promises = chunk.map(async (packageName) => {
|
|
201
|
+
try {
|
|
202
|
+
const info = await this.getPackageInfo(packageName);
|
|
203
|
+
results.set(packageName, info);
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
console.warn(`Failed to query package ${packageName}:`, error);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
await Promise.all(promises);
|
|
210
|
+
}
|
|
211
|
+
return results;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Check if package author has changed
|
|
215
|
+
*/
|
|
216
|
+
async hasPackageAuthorChanged(packageName, fromVersion, toVersion) {
|
|
217
|
+
try {
|
|
218
|
+
// const packageInfo = await this.getPackageInfo(packageName);
|
|
219
|
+
const fromVersionData = await pacote.manifest(`${packageName}@${fromVersion}`, {
|
|
220
|
+
registry: this.registryUrl,
|
|
221
|
+
timeout: this.timeout,
|
|
222
|
+
});
|
|
223
|
+
const toVersionData = await pacote.manifest(`${packageName}@${toVersion}`, {
|
|
224
|
+
registry: this.registryUrl,
|
|
225
|
+
timeout: this.timeout,
|
|
226
|
+
});
|
|
227
|
+
// Compare authors/maintainers
|
|
228
|
+
const fromAuthor = this.normalizeAuthor(fromVersionData.author);
|
|
229
|
+
const toAuthor = this.normalizeAuthor(toVersionData.author);
|
|
230
|
+
return fromAuthor !== toAuthor;
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
console.warn(`Failed to check author change for ${packageName}:`, error);
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get package download statistics
|
|
239
|
+
*/
|
|
240
|
+
async getDownloadStats(packageName, period = 'last-week') {
|
|
241
|
+
try {
|
|
242
|
+
const response = await fetch(`https://api.npmjs.org/downloads/point/${period}/${packageName}`);
|
|
243
|
+
const data = (await response.json());
|
|
244
|
+
return data.downloads || 0;
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
console.warn(`Failed to get download stats for ${packageName}:`, error);
|
|
248
|
+
return 0;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Clear cache
|
|
253
|
+
*/
|
|
254
|
+
clearCache() {
|
|
255
|
+
this.cache.clear();
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get item from cache if not expired
|
|
259
|
+
*/
|
|
260
|
+
getFromCache(key) {
|
|
261
|
+
const cached = this.cache.get(key);
|
|
262
|
+
if (!cached) {
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
if (Date.now() - cached.timestamp > this.cacheTimeout) {
|
|
266
|
+
this.cache.delete(key);
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
return cached.data;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Set item in cache
|
|
273
|
+
*/
|
|
274
|
+
setCache(key, data) {
|
|
275
|
+
this.cache.set(key, {
|
|
276
|
+
data,
|
|
277
|
+
timestamp: Date.now(),
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Split array into chunks
|
|
282
|
+
*/
|
|
283
|
+
chunkArray(array, size) {
|
|
284
|
+
const chunks = [];
|
|
285
|
+
for (let i = 0; i < array.length; i += size) {
|
|
286
|
+
chunks.push(array.slice(i, i + size));
|
|
287
|
+
}
|
|
288
|
+
return chunks;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Normalize author for comparison
|
|
292
|
+
*/
|
|
293
|
+
normalizeAuthor(author) {
|
|
294
|
+
if (typeof author === 'string') {
|
|
295
|
+
return author.toLowerCase().trim();
|
|
296
|
+
}
|
|
297
|
+
if (typeof author === 'object' && author?.name) {
|
|
298
|
+
return author.name.toLowerCase().trim();
|
|
299
|
+
}
|
|
300
|
+
return '';
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=NpmRegistryService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NpmRegistryService.js","sourceRoot":"","sources":["../../../src/infrastructure/external-services/NpmRegistryService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File System Service
|
|
3
|
+
*
|
|
4
|
+
* Provides abstracted file system operations for the application.
|
|
5
|
+
* Handles reading/writing workspace files, package.json, and pnpm-workspace.yaml.
|
|
6
|
+
*/
|
|
7
|
+
import { WorkspacePath } from '../../domain/value-objects/WorkspacePath.js';
|
|
8
|
+
import { PnpmWorkspaceData } from '../../domain/value-objects/WorkspaceConfig.js';
|
|
9
|
+
import { PackageJsonData } from '../../domain/entities/Package.js';
|
|
10
|
+
export declare class FileSystemService {
|
|
11
|
+
/**
|
|
12
|
+
* Check if a file exists
|
|
13
|
+
*/
|
|
14
|
+
exists(filePath: string): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Check if a path is a directory
|
|
17
|
+
*/
|
|
18
|
+
isDirectory(dirPath: string): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Read a text file
|
|
21
|
+
*/
|
|
22
|
+
readTextFile(filePath: string): Promise<string>;
|
|
23
|
+
/**
|
|
24
|
+
* Write a text file
|
|
25
|
+
*/
|
|
26
|
+
writeTextFile(filePath: string, content: string): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Read and parse a JSON file
|
|
29
|
+
*/
|
|
30
|
+
readJsonFile<T = any>(filePath: string): Promise<T>;
|
|
31
|
+
/**
|
|
32
|
+
* Write a JSON file
|
|
33
|
+
*/
|
|
34
|
+
writeJsonFile(filePath: string, data: any, indent?: number): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Read and parse a YAML file
|
|
37
|
+
*/
|
|
38
|
+
readYamlFile<T = any>(filePath: string): Promise<T>;
|
|
39
|
+
/**
|
|
40
|
+
* Write a YAML file
|
|
41
|
+
*/
|
|
42
|
+
writeYamlFile(filePath: string, data: any): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Read pnpm-workspace.yaml configuration
|
|
45
|
+
*/
|
|
46
|
+
readPnpmWorkspaceConfig(workspacePath: WorkspacePath): Promise<PnpmWorkspaceData>;
|
|
47
|
+
/**
|
|
48
|
+
* Write pnpm-workspace.yaml configuration
|
|
49
|
+
*/
|
|
50
|
+
writePnpmWorkspaceConfig(workspacePath: WorkspacePath, config: PnpmWorkspaceData): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Read package.json file
|
|
53
|
+
*/
|
|
54
|
+
readPackageJson(packagePath: WorkspacePath): Promise<PackageJsonData>;
|
|
55
|
+
/**
|
|
56
|
+
* Write package.json file
|
|
57
|
+
*/
|
|
58
|
+
writePackageJson(packagePath: WorkspacePath, packageData: PackageJsonData): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Find package.json files using glob patterns
|
|
61
|
+
*/
|
|
62
|
+
findPackageJsonFiles(workspacePath: WorkspacePath, patterns: string[]): Promise<string[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Find directories matching patterns
|
|
65
|
+
*/
|
|
66
|
+
findDirectories(workspacePath: WorkspacePath, patterns: string[]): Promise<string[]>;
|
|
67
|
+
/**
|
|
68
|
+
* Check if a directory contains a pnpm workspace
|
|
69
|
+
*/
|
|
70
|
+
isPnpmWorkspace(dirPath: string): Promise<boolean>;
|
|
71
|
+
/**
|
|
72
|
+
* Find the nearest pnpm workspace by traversing up the directory tree
|
|
73
|
+
*/
|
|
74
|
+
findNearestWorkspace(startPath: string): Promise<string | null>;
|
|
75
|
+
/**
|
|
76
|
+
* Get file modification time
|
|
77
|
+
*/
|
|
78
|
+
getModificationTime(filePath: string): Promise<Date>;
|
|
79
|
+
/**
|
|
80
|
+
* Create a backup of a file
|
|
81
|
+
*/
|
|
82
|
+
createBackup(filePath: string): Promise<string>;
|
|
83
|
+
/**
|
|
84
|
+
* Restore a file from backup
|
|
85
|
+
*/
|
|
86
|
+
restoreFromBackup(originalPath: string, backupPath: string): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Remove a file
|
|
89
|
+
*/
|
|
90
|
+
removeFile(filePath: string): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* List files in a directory
|
|
93
|
+
*/
|
|
94
|
+
listFiles(dirPath: string): Promise<string[]>;
|
|
95
|
+
/**
|
|
96
|
+
* List directories in a directory
|
|
97
|
+
*/
|
|
98
|
+
listDirectories(dirPath: string): Promise<string[]>;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=FileSystemService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileSystemService.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/file-system/FileSystemService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,qBAAa,iBAAiB;IAC5B;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAShD;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASpD;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQrD;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrE;;OAEG;IACG,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IASzD;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IASnF;;OAEG;IACG,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IASzD;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/D;;OAEG;IACG,uBAAuB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAUvF;;OAEG;IACG,wBAAwB,CAC5B,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,IAAI,CAAC;IAKhB;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAU3E;;OAEG;IACG,gBAAgB,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/F;;OAEG;IACG,oBAAoB,CAAC,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsB/F;;OAEG;IACG,eAAe,CAAC,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmB1F;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQxD;;OAEG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAarE;;OAEG;IACG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1D;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYrD;;OAEG;IACG,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhF;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjD;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IASnD;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAU1D"}
|