@verdaccio/test-helper 4.0.0-next-8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/.babelrc +3 -0
  2. package/.eslintignore +5 -0
  3. package/CHANGELOG.md +563 -0
  4. package/LICENSE +21 -0
  5. package/README.md +80 -0
  6. package/build/actions.d.ts +2 -0
  7. package/build/actions.js +26 -0
  8. package/build/actions.js.map +1 -0
  9. package/build/addNewVersion.d.ts +2 -0
  10. package/build/addNewVersion.js +72 -0
  11. package/build/addNewVersion.js.map +1 -0
  12. package/build/generateLocalPackageMetadata.d.ts +2 -0
  13. package/build/generateLocalPackageMetadata.js +68 -0
  14. package/build/generateLocalPackageMetadata.js.map +1 -0
  15. package/build/generatePackageMetadata.d.ts +3 -0
  16. package/build/generatePackageMetadata.js +64 -0
  17. package/build/generatePackageMetadata.js.map +1 -0
  18. package/build/generatePublishNewVersionManifest.d.ts +16 -0
  19. package/build/generatePublishNewVersionManifest.js +72 -0
  20. package/build/generatePublishNewVersionManifest.js.map +1 -0
  21. package/build/generateRemotePackageMetadata.d.ts +2 -0
  22. package/build/generateRemotePackageMetadata.js +81 -0
  23. package/build/generateRemotePackageMetadata.js.map +1 -0
  24. package/build/generateUnPublishPackageMetadata.d.ts +2 -0
  25. package/build/generateUnPublishPackageMetadata.js +81 -0
  26. package/build/generateUnPublishPackageMetadata.js.map +1 -0
  27. package/build/getDeprecatedPackageMetadata.d.ts +3 -0
  28. package/build/getDeprecatedPackageMetadata.js +18 -0
  29. package/build/getDeprecatedPackageMetadata.js.map +1 -0
  30. package/build/index.d.ts +9 -0
  31. package/build/index.js +69 -0
  32. package/build/index.js.map +1 -0
  33. package/build/initializeServer.d.ts +2 -0
  34. package/build/initializeServer.js +64 -0
  35. package/build/initializeServer.js.map +1 -0
  36. package/build/types.d.ts +3 -0
  37. package/build/types.js +6 -0
  38. package/build/types.js.map +1 -0
  39. package/build/utils.d.ts +1 -0
  40. package/build/utils.js +16 -0
  41. package/build/utils.js.map +1 -0
  42. package/package.json +32 -0
  43. package/src/actions.ts +27 -0
  44. package/src/addNewVersion.ts +60 -0
  45. package/src/generateLocalPackageMetadata.ts +67 -0
  46. package/src/generatePackageMetadata.ts +73 -0
  47. package/src/generatePublishNewVersionManifest.ts +76 -0
  48. package/src/generateRemotePackageMetadata.ts +86 -0
  49. package/src/generateUnPublishPackageMetadata.ts +89 -0
  50. package/src/getDeprecatedPackageMetadata.ts +19 -0
  51. package/src/index.ts +9 -0
  52. package/src/initializeServer.ts +61 -0
  53. package/src/types.ts +3 -0
  54. package/src/utils.ts +8 -0
  55. package/tests/generateUnPublishPackageMetadata.ts.spec.ts +98 -0
  56. package/tests/getDeprecatedPackageMetadata.spec.ts +40 -0
  57. package/tests/metadata.spec.ts +119 -0
  58. package/tests/utils.spec.ts +19 -0
  59. package/tsconfig.build.json +10 -0
  60. package/tsconfig.json +27 -0
  61. package/types/patch.d.ts +18 -0
@@ -0,0 +1,89 @@
1
+ import { UnPublishManifest } from '@verdaccio/types';
2
+
3
+ export function generateUnPublishPackageMetadata(
4
+ pkgName: string,
5
+ versions: string[] = ['1.0.0'],
6
+ distTags,
7
+ rev: string
8
+ ): UnPublishManifest {
9
+ const versionsData = versions.reduce((acc, version) => {
10
+ acc[version] = {
11
+ name: pkgName,
12
+ version: version,
13
+ main: 'index.js',
14
+ scripts: {
15
+ test: 'echo "Error: no test specified" && exit 1',
16
+ },
17
+ author: {
18
+ name: 'Verdaccio Maintainers',
19
+ email: 'verdaccio.npm@gmail.com',
20
+ },
21
+ repository: {
22
+ type: 'git',
23
+ url: 'https://github.com/verdaccio/verdaccio.git',
24
+ },
25
+ homepage: 'https://verdaccio.org',
26
+ funding: {
27
+ type: 'opencollective',
28
+ url: 'https://opencollective.com/verdaccio',
29
+ },
30
+ keywords: [],
31
+ license: 'ISC',
32
+ dependencies: {
33
+ '@verdaccio/logger-7': '^6.0.0-6-next.3',
34
+ },
35
+ bugs: {
36
+ url: 'https://github.com/verdaccio/verdaccio/issues',
37
+ },
38
+ devDependencies: {},
39
+ _id: `${pkgName}@${version}`,
40
+ _nodeVersion: '20.10.0',
41
+ _npmVersion: '10.9.0',
42
+ dist: {
43
+ integrity:
44
+ 'sha512-qc+palHxTF5tUhtAHGikwmv7EqhybOZ3cHUvGQZ9H2a8C7VXQ0e4ZVYS7qpNvYmG3m3khfMzsmx/R96BcxaPfw==',
45
+ shasum: '4ece00c13d4a99722275afb6270d44ca158aaaa0',
46
+ tarball: `http://localhost:8000/${pkgName}/-/${pkgName}-${version}.tgz`,
47
+ fileCount: 3,
48
+ unpackedSize: 6488666,
49
+ },
50
+ contributors: [],
51
+ maintainers: [
52
+ {
53
+ name: 'test',
54
+ email: '',
55
+ },
56
+ ],
57
+ };
58
+ return acc;
59
+ }, {});
60
+
61
+ const timeData = versions.reduce(
62
+ (acc, version) => {
63
+ const now = new Date().toISOString();
64
+ acc[version] = now;
65
+ return acc;
66
+ },
67
+ {} as Record<string, string>
68
+ );
69
+
70
+ return {
71
+ _id: pkgName,
72
+ name: pkgName,
73
+ 'dist-tags': { ...distTags },
74
+ versions: versionsData,
75
+ time: {
76
+ created: new Date().toISOString(),
77
+ modified: new Date().toISOString(),
78
+ ...timeData,
79
+ },
80
+ maintainers: [
81
+ {
82
+ name: 'test',
83
+ email: '',
84
+ },
85
+ ],
86
+ readme: 'ERROR: No README data found!',
87
+ _rev: rev,
88
+ };
89
+ }
@@ -0,0 +1,19 @@
1
+ import { Manifest } from '@verdaccio/types';
2
+
3
+ import { generatePackageMetadata } from './generatePackageMetadata';
4
+ import { DistTags } from './types';
5
+
6
+ export function getDeprecatedPackageMetadata(
7
+ pkgName: string,
8
+ version = '1.0.0',
9
+ distTags: DistTags = { ['latest']: version },
10
+ deprecated = 'default deprecated message',
11
+ rev = 'rev-foo'
12
+ ): Manifest {
13
+ const manifest = generatePackageMetadata(pkgName, version, distTags);
14
+ // deprecated message requires empty attachments
15
+ manifest._attachments = {};
16
+ manifest._rev = rev;
17
+ manifest.versions[version].deprecated = deprecated;
18
+ return manifest;
19
+ }
package/src/index.ts ADDED
@@ -0,0 +1,9 @@
1
+ export { generatePackageMetadata } from './generatePackageMetadata';
2
+ export { getDeprecatedPackageMetadata } from './getDeprecatedPackageMetadata';
3
+ export { generateLocalPackageMetadata } from './generateLocalPackageMetadata';
4
+ export { generateRemotePackageMetadata } from './generateRemotePackageMetadata';
5
+ export { addNewVersion } from './addNewVersion';
6
+ export { generatePublishNewVersionManifest } from './generatePublishNewVersionManifest';
7
+ export { initializeServer } from './initializeServer';
8
+ export { publishVersion } from './actions';
9
+ export { generateUnPublishPackageMetadata } from './generateUnPublishPackageMetadata';
@@ -0,0 +1,61 @@
1
+ import buildDebug from 'debug';
2
+ import express, { Application } from 'express';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+
6
+ import { Auth } from '@verdaccio/auth';
7
+ import { Config } from '@verdaccio/config';
8
+ import { cryptoUtils, errorUtils } from '@verdaccio/core';
9
+ import { setup } from '@verdaccio/logger';
10
+ import { errorReportingMiddleware, final, handleError } from '@verdaccio/middleware';
11
+
12
+ const debug = buildDebug('verdaccio:tools:helpers:server');
13
+
14
+ export async function initializeServer(
15
+ configObject,
16
+ routesMiddleware: any[] = [],
17
+ Storage
18
+ ): Promise<Application> {
19
+ const app = express();
20
+ const logger = setup(configObject.log ?? {});
21
+ const config = new Config(configObject);
22
+ config.storage = path.join(os.tmpdir(), '/storage', cryptoUtils.generateRandomHexString());
23
+ // httpass would get path.basename() for configPath thus we need to create a dummy folder
24
+ // to avoid conflics
25
+ config.configPath = config.storage;
26
+ debug('storage: %s', config.storage);
27
+
28
+ const storage = new Storage(config, logger);
29
+ await storage.init(config, []);
30
+ const auth: Auth = new Auth(config, logger);
31
+ await auth.init();
32
+ // TODO: this might not be need it, used in apiEndpoints
33
+ app.use(express.json({ strict: false, limit: '10mb' }));
34
+ // @ts-ignore
35
+ app.use(errorReportingMiddleware(logger));
36
+ for (let route of routesMiddleware) {
37
+ if (route.async) {
38
+ const middleware = await route.routes(config, auth, storage, logger);
39
+ app.use(middleware);
40
+ } else {
41
+ app.use(route(config, auth, storage, logger));
42
+ }
43
+ }
44
+
45
+ // catch 404
46
+ app.get('/*', function (req, res, next) {
47
+ next(errorUtils.getNotFound('resource not found'));
48
+ });
49
+
50
+ // @ts-ignore
51
+ app.use(handleError(logger));
52
+ // @ts-ignore
53
+ app.use(final);
54
+
55
+ app.use(function (request, response) {
56
+ response.status(590);
57
+ response.json({ error: 'cannot handle this' });
58
+ });
59
+
60
+ return app;
61
+ }
package/src/types.ts ADDED
@@ -0,0 +1,3 @@
1
+ export interface DistTags {
2
+ [key: string]: string;
3
+ }
package/src/utils.ts ADDED
@@ -0,0 +1,8 @@
1
+ export const getTarball = (name: string): string => {
2
+ const r = name.split('/');
3
+ if (r.length === 1) {
4
+ return r[0];
5
+ } else {
6
+ return r[1];
7
+ }
8
+ };
@@ -0,0 +1,98 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ // Update the import path accordingly
4
+ import { UnPublishManifest } from '@verdaccio/types';
5
+
6
+ import { generateUnPublishPackageMetadata } from '../src/generateUnPublishPackageMetadata';
7
+
8
+ describe('generateUnPublishPackageMetadata', () => {
9
+ it('should generate metadata for a single version', () => {
10
+ const pkgName = 'test-package';
11
+ const versions = ['1.0.0'];
12
+ const distTags = { latest: '1.0.0' };
13
+ const rev = '1-abc';
14
+
15
+ const result: UnPublishManifest = generateUnPublishPackageMetadata(
16
+ pkgName,
17
+ versions,
18
+ distTags,
19
+ rev
20
+ );
21
+
22
+ expect(result._id).toBe(pkgName);
23
+ expect(result.name).toBe(pkgName);
24
+ expect(result['dist-tags']).toEqual(distTags);
25
+ expect(result.versions['1.0.0']).toBeDefined();
26
+ expect(result.versions['1.0.0'].name).toBe(pkgName);
27
+ expect(result.versions['1.0.0'].version).toBe('1.0.0');
28
+ expect(result._rev).toBe(rev);
29
+ expect(result.time?.created).toBeDefined();
30
+ expect(result.time?.modified).toBeDefined();
31
+ expect(result.time?.['1.0.0']).toBeDefined();
32
+ });
33
+
34
+ it('should generate metadata for multiple versions', () => {
35
+ const pkgName = 'test-package';
36
+ const versions = ['1.0.0', '2.0.0'];
37
+ const distTags = { latest: '2.0.0' };
38
+ const rev = '1-xyz';
39
+
40
+ const result: UnPublishManifest = generateUnPublishPackageMetadata(
41
+ pkgName,
42
+ versions,
43
+ distTags,
44
+ rev
45
+ );
46
+
47
+ expect(result._id).toBe(pkgName);
48
+ expect(result.name).toBe(pkgName);
49
+ expect(result['dist-tags']).toEqual(distTags);
50
+ expect(result.versions['1.0.0']).toBeDefined();
51
+ expect(result.versions['1.0.0'].version).toBe('1.0.0');
52
+ expect(result.versions['2.0.0']).toBeDefined();
53
+ expect(result.versions['2.0.0'].version).toBe('2.0.0');
54
+ expect(result._rev).toBe(rev);
55
+ expect(result.time?.['1.0.0']).toBeDefined();
56
+ expect(result.time?.['2.0.0']).toBeDefined();
57
+ });
58
+
59
+ it('should include default metadata fields', () => {
60
+ const pkgName = 'default-test';
61
+ const versions = ['1.0.0'];
62
+ const distTags = { latest: '1.0.0' };
63
+ const rev = '1-def';
64
+
65
+ const result: UnPublishManifest = generateUnPublishPackageMetadata(
66
+ pkgName,
67
+ versions,
68
+ distTags,
69
+ rev
70
+ );
71
+
72
+ const versionData = result.versions['1.0.0'];
73
+ expect(versionData).toMatchObject({
74
+ name: pkgName,
75
+ version: '1.0.0',
76
+ main: 'index.js',
77
+ scripts: {
78
+ test: 'echo "Error: no test specified" && exit 1',
79
+ },
80
+ author: {
81
+ name: 'Verdaccio Maintainers',
82
+ email: 'verdaccio.npm@gmail.com',
83
+ },
84
+ repository: {
85
+ type: 'git',
86
+ url: 'https://github.com/verdaccio/verdaccio.git',
87
+ },
88
+ homepage: 'https://verdaccio.org',
89
+ funding: {
90
+ type: 'opencollective',
91
+ url: 'https://opencollective.com/verdaccio',
92
+ },
93
+ license: 'ISC',
94
+ });
95
+ expect(versionData.dist).toBeDefined();
96
+ expect(versionData.maintainers).toContainEqual({ name: 'test', email: '' });
97
+ });
98
+ });
@@ -0,0 +1,40 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { Manifest } from '@verdaccio/types';
4
+
5
+ import { getDeprecatedPackageMetadata } from '../src/getDeprecatedPackageMetadata';
6
+ import { DistTags } from '../src/types';
7
+
8
+ describe('getDeprecatedPackageMetadata', () => {
9
+ const pkgName = 'test-package';
10
+ const version = '2.0.0';
11
+ const distTags: DistTags = { latest: '2.0.0' };
12
+ const deprecatedMessage = 'This package version is deprecated';
13
+ const rev = 'rev-bar';
14
+
15
+ it('should generate a deprecated package manifest with default values', () => {
16
+ const result: Manifest = getDeprecatedPackageMetadata(pkgName);
17
+
18
+ expect(result.name).toBe(pkgName);
19
+ expect(result.versions['1.0.0'].deprecated).toBe('default deprecated message');
20
+ expect(result._rev).toBe('rev-foo');
21
+ expect(result._attachments).toEqual({});
22
+ });
23
+
24
+ it('should generate a deprecated package manifest with specified version, distTags, and deprecated message', () => {
25
+ const result: Manifest = getDeprecatedPackageMetadata(
26
+ pkgName,
27
+ version,
28
+ distTags,
29
+ deprecatedMessage,
30
+ rev
31
+ );
32
+
33
+ expect(result.name).toBe(pkgName);
34
+ expect(result.versions[version]).toBeDefined();
35
+ expect(result.versions[version].deprecated).toBe(deprecatedMessage);
36
+ expect(result['dist-tags']).toEqual(distTags);
37
+ expect(result._rev).toBe(rev);
38
+ expect(result._attachments).toEqual({});
39
+ });
40
+ });
@@ -0,0 +1,119 @@
1
+ import { describe, expect, test } from 'vitest';
2
+
3
+ import {
4
+ addNewVersion,
5
+ generateLocalPackageMetadata,
6
+ generatePackageMetadata,
7
+ generateRemotePackageMetadata,
8
+ } from '../src';
9
+
10
+ describe('generate metadata', () => {
11
+ describe('generatePackageMetadata', () => {
12
+ test('should generate package metadata', () => {
13
+ expect(generatePackageMetadata('foo', '1.0.0')).toBeDefined();
14
+ });
15
+
16
+ test('should match versions', () => {
17
+ const manifest = generatePackageMetadata('foo', '1.0.0');
18
+ expect(Object.keys(manifest.versions)).toEqual(['1.0.0']);
19
+ });
20
+
21
+ test('should add new versions', () => {
22
+ const manifest = generatePackageMetadata('foo', '1.0.0');
23
+ const m1 = addNewVersion(manifest, '1.0.1');
24
+ expect(Object.keys(m1.versions)).toEqual(['1.0.0', '1.0.1']);
25
+ const m = addNewVersion(m1, '1.0.2');
26
+ expect(Object.keys(m.versions)).toEqual(['1.0.0', '1.0.1', '1.0.2']);
27
+ expect(m['dist-tags'].latest).toEqual('1.0.2');
28
+ expect(m._distfiles['foo-1.0.2.tgz']).toEqual({
29
+ sha: '2c03764f651a9f016ca0b7620421457b619151b9',
30
+ url: 'http://localhost:5555/foo/-/foo-1.0.2.tgz',
31
+ });
32
+ });
33
+
34
+ test('should fails add repeated version', () => {
35
+ const manifest = generatePackageMetadata('foo', '1.0.0');
36
+ expect(() => Object.keys(addNewVersion(manifest, '1.0.0').versions)).toThrow();
37
+ });
38
+ });
39
+ describe('generateRemotePackageMetadata', () => {
40
+ test('should generate package metadata', () => {
41
+ expect(
42
+ generateRemotePackageMetadata('foo', '1.0.0', 'https://registry.verdaccio.org')
43
+ ).toBeDefined();
44
+ });
45
+
46
+ test('should generate package metadata with multiple versions', () => {
47
+ const m = generateRemotePackageMetadata('foo', '1.0.0', 'https://registry.verdaccio.org', [
48
+ '1.0.1',
49
+ '1.0.2',
50
+ '3.0.0',
51
+ ]);
52
+ expect(m).toBeDefined();
53
+ expect(Object.keys(m.versions)).toEqual(['1.0.0', '1.0.1', '1.0.2', '3.0.0']);
54
+ expect(Object.keys(m.time)).toEqual([
55
+ 'modified',
56
+ 'created',
57
+ '1.0.0',
58
+ '1.0.1',
59
+ '1.0.2',
60
+ '3.0.0',
61
+ ]);
62
+ });
63
+ });
64
+ describe('generateLocalPackageMetadata', () => {
65
+ test('should generate local package metadata', () => {
66
+ const m = generateLocalPackageMetadata('foo', '1.0.0', 'https://registry.verdaccio.org');
67
+ expect(m).toBeDefined();
68
+ expect(m._attachments['foo-1.0.0.tgz']).toEqual({
69
+ shasum: '2c03764f651a9f016ca0b7620421457b619151b9',
70
+ version: '1.0.0',
71
+ });
72
+ expect(m._distfiles).toEqual({});
73
+ });
74
+
75
+ test('should add new versions local', () => {
76
+ const manifest = generateLocalPackageMetadata('foo', '1.0.0');
77
+ const m1 = addNewVersion(manifest, '1.0.1', false);
78
+ expect(Object.keys(m1._attachments)).toEqual(['foo-1.0.0.tgz', 'foo-1.0.1.tgz']);
79
+ expect(Object.keys(m1._distfiles)).toEqual([]);
80
+ const m2 = addNewVersion(m1, '1.0.2', false);
81
+ expect(Object.keys(m2.versions)).toEqual(['1.0.0', '1.0.1', '1.0.2']);
82
+ expect(m2['dist-tags'].latest).toEqual('1.0.2');
83
+ expect(m2._distfiles).toEqual({});
84
+ expect(m2._attachments).toEqual({
85
+ 'foo-1.0.0.tgz': {
86
+ shasum: '2c03764f651a9f016ca0b7620421457b619151b9',
87
+ version: '1.0.0',
88
+ },
89
+ 'foo-1.0.1.tgz': {
90
+ shasum: '2c03764f651a9f016ca0b7620421457b619151b9',
91
+ version: '1.0.1',
92
+ },
93
+ 'foo-1.0.2.tgz': {
94
+ shasum: '2c03764f651a9f016ca0b7620421457b619151b9',
95
+ version: '1.0.2',
96
+ },
97
+ });
98
+ const m3 = addNewVersion(m2, '1.0.3', false);
99
+ expect(m3._attachments).toEqual({
100
+ 'foo-1.0.0.tgz': {
101
+ shasum: '2c03764f651a9f016ca0b7620421457b619151b9',
102
+ version: '1.0.0',
103
+ },
104
+ 'foo-1.0.1.tgz': {
105
+ shasum: '2c03764f651a9f016ca0b7620421457b619151b9',
106
+ version: '1.0.1',
107
+ },
108
+ 'foo-1.0.2.tgz': {
109
+ shasum: '2c03764f651a9f016ca0b7620421457b619151b9',
110
+ version: '1.0.2',
111
+ },
112
+ 'foo-1.0.3.tgz': {
113
+ shasum: '2c03764f651a9f016ca0b7620421457b619151b9',
114
+ version: '1.0.3',
115
+ },
116
+ });
117
+ });
118
+ });
119
+ });
@@ -0,0 +1,19 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { getTarball } from '../src/utils';
4
+
5
+ describe('getTarball', () => {
6
+ it('should return the name when there is no "/" in the input string', () => {
7
+ const input = 'simple-name';
8
+ const result = getTarball(input);
9
+
10
+ expect(result).toBe('simple-name');
11
+ });
12
+
13
+ it('should return the second part of the name when there is a "/" in the input string', () => {
14
+ const input = 'scope/package-name';
15
+ const result = getTarball(input);
16
+
17
+ expect(result).toBe('package-name');
18
+ });
19
+ });
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "rootDir": "./src",
5
+ "outDir": "./build",
6
+ "preserveSymlinks": true
7
+ },
8
+ "include": ["src/**/*.ts", "types/*.d.ts"],
9
+ "exclude": ["src/**/*.test.ts"]
10
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "extends": "../../../tsconfig.reference.json",
3
+ "compilerOptions": {
4
+ "rootDir": "./src",
5
+ "outDir": "./build",
6
+ "composite": true,
7
+ "declaration": true
8
+ },
9
+ "include": ["src/**/*.ts"],
10
+ "references": [
11
+ {
12
+ "path": "../../auth"
13
+ },
14
+ {
15
+ "path": "../../config"
16
+ },
17
+ {
18
+ "path": "../../utils"
19
+ },
20
+ {
21
+ "path": "../../middleware"
22
+ },
23
+ {
24
+ "path": "../../core/core"
25
+ }
26
+ ]
27
+ }
@@ -0,0 +1,18 @@
1
+ declare module 'jest-matcher-utils';
2
+ declare module 'pretty-format' {
3
+ export type Plugin = any;
4
+ }
5
+ declare module '@jest/schemas' {
6
+ export type SnapshotFormat = any;
7
+ }
8
+
9
+ declare module 'ms';
10
+
11
+ declare module '@jest/expect-utils';
12
+ declare module 'jest';
13
+ declare module 'expect' {
14
+ export type MatcherState = any;
15
+ export type MatcherUtils = any;
16
+ export type Tester = any;
17
+ export type EqualsFunction = any;
18
+ }