diff --git a/.github/workflows/e2e-ci.yml b/.github/workflows/e2e-ci.yml index e48d43e..ebb3165 100644 --- a/.github/workflows/e2e-ci.yml +++ b/.github/workflows/e2e-ci.yml @@ -1,9 +1,15 @@ name: E2E CLI +concurrency: + group: e2e-cli-${{ github.ref }} + cancel-in-progress: true + on: workflow_dispatch: pull_request: push: + branches: + - main schedule: # run every sunday - cron: '0 0 * * 0' @@ -55,8 +61,8 @@ jobs: strategy: fail-fast: false matrix: - pkg: [npm6, npm7, npm8, npm9, npm10, pnpm7, pnpm9, yarn1, yarn2, yarn3, yarn4] - node: [18] + pkg: [npm7, npm8, npm9, npm10, pnpm8, pnpm9, pnpm10, yarn1, yarn2, yarn3, yarn4] + node: [20, 22, 23] name: ${{ matrix.pkg }}/ ubuntu-latest / ${{ matrix.node }} runs-on: ubuntu-latest steps: diff --git a/.nvmrc b/.nvmrc index 209e3ef..b393560 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20 +23 \ No newline at end of file diff --git a/e2e/cli/README.md b/e2e/cli/README.md index 621676d..d8a5a9b 100644 --- a/e2e/cli/README.md +++ b/e2e/cli/README.md @@ -10,18 +10,18 @@ ### Commands Tested -| cmd | npm6 | npm7 | npm8 | npm9 | pnpm6 | pnpm7 | pnpm8 | pnpm9 | yarn1 | yarn2 | yarn3 | yarn4 | -| --------- | ---- | ---- | ---- | ---- | ----- | ----- | ----- |-------| ----- | ----- | ----- | ----- | -| publish | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| info | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| audit | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | -| install | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| deprecate | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔ | ⛔ | ⛔ | ⛔ | -| ping | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔ | ⛔ | ⛔ | ⛔ | -| search | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔ | ⛔ | ⛔ | ⛔ | -| star | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔ | ⛔ | ⛔ | ⛔ | -| stars | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔ | ⛔ | ⛔ | ⛔ | -| dist-tag | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | +| cmd | npm6 | npm7 | npm8 | npm9 | pnpm6 | pnpm7 | pnpm8 | yarn1 | yarn2 | yarn3 | yarn4 | +| --------- | ---- | ---- | ---- | ---- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | +| publish | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| info | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| audit | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | +| install | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| deprecate | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔ | ⛔ | ⛔ | ⛔ | +| ping | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔ | ⛔ | ⛔ | ⛔ | +| search | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔ | ⛔ | ⛔ | ⛔ | +| star | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔ | ⛔ | ⛔ | ⛔ | +| stars | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔ | ⛔ | ⛔ | ⛔ | +| dist-tag | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | > notes: > diff --git a/e2e/cli/e2e-npm6/.babelrc b/e2e/cli/e2e-npm-commons/.babelrc similarity index 100% rename from e2e/cli/e2e-npm6/.babelrc rename to e2e/cli/e2e-npm-commons/.babelrc diff --git a/e2e/cli/e2e-npm6/.eslintrc b/e2e/cli/e2e-npm-commons/.eslintrc similarity index 100% rename from e2e/cli/e2e-npm6/.eslintrc rename to e2e/cli/e2e-npm-commons/.eslintrc diff --git a/e2e/cli/e2e-npm-commons/audit.ts b/e2e/cli/e2e-npm-commons/audit.ts new file mode 100644 index 0000000..0d819c6 --- /dev/null +++ b/e2e/cli/e2e-npm-commons/audit.ts @@ -0,0 +1,45 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; + +export function runAudit(npm) { + describe('audit a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test.each([['verdaccio-memory', '@verdaccio/cli']])( + 'should audit a package %s', + async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-patch', + registry.port, + registry.getToken(), + registry.getRegistryUrl(), + { jquery: '3.6.1' } + ); + // install is required to create package lock file + await npm({ cwd: tempFolder }, 'install', ...addRegistry(registry.getRegistryUrl())); + const resp = await npm( + { cwd: tempFolder }, + 'audit', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + const parsedBody = JSON.parse(resp.stdout as string); + expect(parsedBody.metadata).toBeDefined(); + expect(parsedBody.auditReportVersion).toBeDefined(); + expect(parsedBody.vulnerabilities).toBeDefined(); + } + ); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-npm-commons/deprecate.ts b/e2e/cli/e2e-npm-commons/deprecate.ts new file mode 100644 index 0000000..c15f827 --- /dev/null +++ b/e2e/cli/e2e-npm-commons/deprecate.ts @@ -0,0 +1,119 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { + addRegistry, + initialSetup, + npmUtils, + prepareGenericEmptyProject, +} from '@verdaccio/test-cli-commons'; + +export function runDeprecate(npm) { + describe('deprecate a package', () => { + let registry; + + async function deprecate(tempFolder, packageVersion, registry, message) { + await npm( + { cwd: tempFolder }, + 'deprecate', + packageVersion, + message, + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + } + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test.each([['@verdaccio/deprecated-1']])( + 'should deprecate a single package %s', + async (pkgName) => { + const message = 'some message'; + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + // deprecate one version + await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); + // verify is deprecated + const infoBody = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); + expect(infoBody.name).toEqual(pkgName); + expect(infoBody.deprecated).toEqual(message); + } + ); + + test.each([['@verdaccio/deprecated-2']])( + 'should un-deprecate a package %s', + async (pkgName) => { + const message = 'some message'; + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + // deprecate one version + await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); + // verify is deprecated + const infoBody = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); + expect(infoBody.deprecated).toEqual(message); + // empty string is same as undeprecate + await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, ''); + const infoBody2 = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); + expect(infoBody2.deprecated).toBeUndefined(); + } + ); + + test.each([['@verdaccio/deprecated-3']])( + 'should deprecate a multiple packages %s', + async (pkgName) => { + const message = 'some message'; + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + // publish 1.0.0 + await npmUtils.publish(npm, tempFolder, pkgName, registry); + // publish 1.1.0 + await npmUtils.bumbUp(npm, tempFolder, registry); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + // publish 1.2.0 + await npmUtils.bumbUp(npm, tempFolder, registry); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + // publish 1.3.0 + await npmUtils.bumbUp(npm, tempFolder, registry); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + // // deprecate all version + await deprecate(tempFolder, pkgName, registry, message); + // verify is deprecated + for (let v of ['1.0.0', '1.1.0', '1.2.0', '1.3.0']) { + const infoResp = await npmUtils.getInfoVersions(npm, `${pkgName}@${v}`, registry); + expect(infoResp.deprecated).toEqual(message); + } + // publish normal version + // publish 1.4.0 + await npmUtils.bumbUp(npm, tempFolder, registry); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + const infoResp = await npmUtils.getInfoVersions(npm, `${pkgName}@1.4.0`, registry); + // must be not deprecated + expect(infoResp.deprecated).toBeUndefined(); + } + ); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-npm-commons/dist-tags.ts b/e2e/cli/e2e-npm-commons/dist-tags.ts new file mode 100644 index 0000000..323939a --- /dev/null +++ b/e2e/cli/e2e-npm-commons/dist-tags.ts @@ -0,0 +1,92 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { + addRegistry, + initialSetup, + npmUtils, + prepareGenericEmptyProject, +} from '@verdaccio/test-cli-commons'; + +export function runDistTag(npm) { + describe('dist-tag a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test.each([['@foo/foo', 'foo']])('should list dist-tags for %s', async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + await npmUtils.bumbUp(npm, tempFolder, registry); + await npmUtils.publish(npm, tempFolder, pkgName, registry, ['--tag', 'beta']); + const resp2 = await npm( + { cwd: tempFolder }, + 'dist-tag', + 'ls', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp2.stdout).toEqual('beta: 1.1.0latest: 1.0.0'); + }); + + test.each([['@verdaccio/bar']])('should remove tag with dist-tags for %s', async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + await npmUtils.bumbUp(npm, tempFolder, registry); + await npmUtils.publish(npm, tempFolder, pkgName, registry, ['--tag', 'beta']); + const resp2 = await npm( + { cwd: tempFolder }, + 'dist-tag', + 'rm', + `${pkgName}@1.1.0`, + 'beta', + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp2.stdout).toEqual('-beta: @verdaccio/bar@1.1.0'); + }); + + test.each([['@verdaccio/five']])( + 'should add tag to package and version with dist-tags for %s', + async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + await npmUtils.bumbUp(npm, tempFolder, registry); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + const resp2 = await npm( + { cwd: tempFolder }, + 'dist-tag', + 'add', + `${pkgName}@1.1.0`, + 'alfa', + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp2.stdout).toEqual(`+alfa: ${pkgName}@1.1.0`); + } + ); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-npm-commons/index.ts b/e2e/cli/e2e-npm-commons/index.ts new file mode 100644 index 0000000..8bd4f18 --- /dev/null +++ b/e2e/cli/e2e-npm-commons/index.ts @@ -0,0 +1,10 @@ +export { runAudit } from './audit'; +export { runDeprecate } from './deprecate'; +export { runInstall } from './install'; +export { runInfo } from './info'; +export { runPing } from './ping'; +export { runPublish } from './publish'; +export { runSearch } from './search'; +export { runStar } from './star'; +export { runUnpublish } from './unpublish'; +export { runDistTag } from './dist-tags'; diff --git a/e2e/cli/e2e-npm-commons/info.ts b/e2e/cli/e2e-npm-commons/info.ts new file mode 100644 index 0000000..de1dd64 --- /dev/null +++ b/e2e/cli/e2e-npm-commons/info.ts @@ -0,0 +1,32 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; + +export function runInfo(npm) { + describe('install a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test('should run npm info json body', async () => { + const resp = await npm( + {}, + 'info', + 'verdaccio', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + const parsedBody = JSON.parse(resp.stdout as string); + expect(parsedBody.name).toEqual('verdaccio'); + expect(parsedBody.dependencies).toBeDefined(); + }); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-npm-commons/install.ts b/e2e/cli/e2e-npm-commons/install.ts new file mode 100644 index 0000000..cbaebe4 --- /dev/null +++ b/e2e/cli/e2e-npm-commons/install.ts @@ -0,0 +1,39 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; + +export function runInstall(npm) { + describe('install a project packages', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test('should run npm install json body', async () => { + const { tempFolder } = await prepareGenericEmptyProject( + 'something', + '1.0.0-patch', + registry.port, + registry.getToken(), + registry.getRegistryUrl(), + { react: '18.2.0' } + ); + const resp = await npm( + { cwd: tempFolder }, + 'install', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + const parsedBody = JSON.parse(resp.stdout as string); + expect(parsedBody.added).toBeDefined(); + expect(parsedBody.audit).toBeDefined(); + }); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-npm-commons/package.json b/e2e/cli/e2e-npm-commons/package.json new file mode 100644 index 0000000..c5fb05a --- /dev/null +++ b/e2e/cli/e2e-npm-commons/package.json @@ -0,0 +1,11 @@ +{ + "private": true, + "name": "@verdaccio/e2e-cli-npm-common", + "version": "1.0.0", + "dependencies": { + "@verdaccio/test-cli-commons": "workspace:*" + }, + "scripts": { + "test": "echo no test" + } +} diff --git a/e2e/cli/e2e-npm-commons/ping.ts b/e2e/cli/e2e-npm-commons/ping.ts new file mode 100644 index 0000000..d68092f --- /dev/null +++ b/e2e/cli/e2e-npm-commons/ping.ts @@ -0,0 +1,25 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; + +export function runPing(npm) { + describe('ping registry', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test('should ping registry', async () => { + const resp = await npm({}, 'ping', '--json', ...addRegistry(registry.getRegistryUrl())); + const parsedBody = JSON.parse(resp.stdout as string); + expect(parsedBody.registry).toEqual(registry.getRegistryUrl() + '/'); + }); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-npm-commons/publish.ts b/e2e/cli/e2e-npm-commons/publish.ts new file mode 100644 index 0000000..17a7554 --- /dev/null +++ b/e2e/cli/e2e-npm-commons/publish.ts @@ -0,0 +1,42 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; + +export function runPublish(npm) { + describe('publish a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test.each([['verdaccio-memory', 'verdaccio', '@verdaccio/foo', '@verdaccio/some-foo']])( + 'should publish a package %s', + async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-patch', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + const resp = await npm( + { cwd: tempFolder }, + 'publish', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + const parsedBody = JSON.parse(resp.stdout as string); + expect(parsedBody.name).toEqual(pkgName); + expect(parsedBody.files).toBeDefined(); + expect(parsedBody.files).toBeDefined(); + } + ); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-npm-commons/search.ts b/e2e/cli/e2e-npm-commons/search.ts new file mode 100644 index 0000000..08390b7 --- /dev/null +++ b/e2e/cli/e2e-npm-commons/search.ts @@ -0,0 +1,34 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; + +export function runSearch(npm) { + describe('search a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test('should search a package', async () => { + const resp = await npm( + {}, + 'search', + '@verdaccio/cli', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + const parsedBody = JSON.parse(resp.stdout as string); + const pkgFind = parsedBody.find((item) => { + return item.name === '@verdaccio/cli'; + }); + expect(pkgFind.name).toEqual('@verdaccio/cli'); + }); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-npm-commons/star.ts b/e2e/cli/e2e-npm-commons/star.ts new file mode 100644 index 0000000..fa830b4 --- /dev/null +++ b/e2e/cli/e2e-npm-commons/star.ts @@ -0,0 +1,90 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { + addRegistry, + initialSetup, + npmUtils, + prepareGenericEmptyProject, +} from '@verdaccio/test-cli-commons'; + +export function runStar(npm) { + describe('star a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test.each([['@verdaccio/foo']])('should star a package %s', async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-patch', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + + await npmUtils.publish(npm, tempFolder, pkgName, registry); + const resp = await npm( + { cwd: tempFolder }, + 'star', + pkgName, + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp.stdout).toEqual(`★ ${pkgName}`); + }); + + test.each([['@verdaccio/bar']])('should unstar a package %s', async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-patch', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + + await npmUtils.publish(npm, tempFolder, pkgName, registry); + const resp = await npm( + { cwd: tempFolder }, + 'star', + pkgName, + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp.stdout).toEqual(`★ ${pkgName}`); + + const resp1 = await npm( + { cwd: tempFolder }, + 'unstar', + pkgName, + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp1.stdout).toEqual(`☆ ${pkgName}`); + }); + + test('should list stars of a user %s', async () => { + const pkgName = '@verdaccio/stars'; + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-patch', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + await npm({ cwd: tempFolder }, 'star', pkgName, ...addRegistry(registry.getRegistryUrl())); + const resp = await npm( + { cwd: tempFolder }, + 'stars', + ...addRegistry(registry.getRegistryUrl()) + ); + // side effects: this result is affected the the package published in the previous step + expect(resp.stdout).toEqual(`@verdaccio/foo@verdaccio/stars`); + }); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-npm-commons/tsconfig.json b/e2e/cli/e2e-npm-commons/tsconfig.json new file mode 100644 index 0000000..a5e8431 --- /dev/null +++ b/e2e/cli/e2e-npm-commons/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../../tsconfig.reference.json" +} diff --git a/e2e/cli/e2e-npm-commons/unpublish.ts b/e2e/cli/e2e-npm-commons/unpublish.ts new file mode 100644 index 0000000..32f6a93 --- /dev/null +++ b/e2e/cli/e2e-npm-commons/unpublish.ts @@ -0,0 +1,86 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { + addRegistry, + initialSetup, + npmUtils, + prepareGenericEmptyProject, +} from '@verdaccio/test-cli-commons'; + +export function runUnpublish(npm) { + describe('unpublish a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test.each([['@verdaccio/test1', 'super-package-do-not-exist-spam']])( + 'should unpublish a full package %s', + async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-beta', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + await npmUtils.bumpUpPackage(npm, tempFolder, pkgName, registry, ['minor']); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + await npmUtils.bumpUpPackage(npm, tempFolder, pkgName, registry, ['minor']); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + await npmUtils.bumpUpPackage(npm, tempFolder, pkgName, registry, ['major']); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + + const resp2 = await npm( + { cwd: tempFolder }, + 'unpublish', + pkgName, + '--force', + '--loglevel=info', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp2.stdout).toEqual('- @verdaccio/test1'); + } + ); + + test.each([['@verdaccio/test1', 'super-package-do-not-exist-spam']])( + 'should unpublish a package %s version', + async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-beta', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + await npmUtils.bumpUpPackage(npm, tempFolder, pkgName, registry, ['minor']); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + await npmUtils.bumpUpPackage(npm, tempFolder, pkgName, registry, ['minor']); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + await npmUtils.bumpUpPackage(npm, tempFolder, pkgName, registry, ['major']); + await npmUtils.publish(npm, tempFolder, pkgName, registry); + + const resp2 = await npm( + { cwd: tempFolder }, + 'unpublish', + `${pkgName}@1.0.0-beta`, + '--force', + '--loglevel=info', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp2.stdout).toEqual('- @verdaccio/test1@1.0.0-beta'); + } + ); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-npm6/CHANGELOG.md b/e2e/cli/e2e-npm10/CHANGELOG.md similarity index 58% rename from e2e/cli/e2e-npm6/CHANGELOG.md rename to e2e/cli/e2e-npm10/CHANGELOG.md index 74c4466..96b99d8 100644 --- a/e2e/cli/e2e-npm6/CHANGELOG.md +++ b/e2e/cli/e2e-npm10/CHANGELOG.md @@ -1,4 +1,27 @@ -# @verdaccio/e2e-cli-npm6 +# @verdaccio/e2e-cli-npm9 + +## 1.0.1 + +### Patch Changes + +- Updated dependencies [351aeeaa8] +- Updated dependencies [d167f92e1] +- Updated dependencies [c383eb68c] + - @verdaccio/test-cli-commons@1.1.0 + +## 1.0.1-6-next.7 + +### Patch Changes + +- Updated dependencies [c383eb68] + - @verdaccio/test-cli-commons@1.1.0-6-next.7 + +## 1.0.1-6-next.6 + +### Patch Changes + +- Updated dependencies [d167f92e] + - @verdaccio/test-cli-commons@1.1.0-6-next.6 ## 1.0.1-6-next.5 diff --git a/e2e/cli/e2e-npm10/audit.spec.ts b/e2e/cli/e2e-npm10/audit.spec.ts index b2ecf2d..f54f746 100644 --- a/e2e/cli/e2e-npm10/audit.spec.ts +++ b/e2e/cli/e2e-npm10/audit.spec.ts @@ -1,44 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runAudit } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('audit a package', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', '@verdaccio/cli']])( - 'should audit a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { jquery: '3.6.1' } - ); - // install is required to create package lock file - await npm({ cwd: tempFolder }, 'install', ...addRegistry(registry.getRegistryUrl())); - const resp = await npm( - { cwd: tempFolder }, - 'audit', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.metadata).toBeDefined(); - expect(parsedBody.auditReportVersion).toBeDefined(); - expect(parsedBody.vulnerabilities).toBeDefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runAudit(npm); }); diff --git a/e2e/cli/e2e-npm10/deprecate.spec.ts b/e2e/cli/e2e-npm10/deprecate.spec.ts index 9855138..8ff989f 100644 --- a/e2e/cli/e2e-npm10/deprecate.spec.ts +++ b/e2e/cli/e2e-npm10/deprecate.spec.ts @@ -1,115 +1,9 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runDeprecate } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('deprecate a package', () => { - jest.setTimeout(20000); - let registry; - - async function deprecate(tempFolder, packageVersion, registry, message) { - await npm( - { cwd: tempFolder }, - 'deprecate', - packageVersion, - message, - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - } - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/deprecated-1']])( - 'should deprecate a single package %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody.name).toEqual(pkgName); - expect(infoBody.deprecated).toEqual(message); - } - ); - - test.each([['@verdaccio/deprecated-2']])('should un-deprecate a package %s', async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody.deprecated).toEqual(message); - // empty string is same as undeprecate - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, ''); - const infoBody2 = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody2.deprecated).toBeUndefined(); - }); - - test.each([['@verdaccio/deprecated-3']])( - 'should deprecate a multiple packages %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - // publish 1.0.0 - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.1.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.2.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.3.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // // deprecate all version - await deprecate(tempFolder, pkgName, registry, message); - // verify is deprecated - for (let v of ['1.0.0', '1.1.0', '1.2.0', '1.3.0']) { - const infoResp = await npmUtils.getInfoVersions(npm, `${pkgName}@${v}`, registry); - expect(infoResp.deprecated).toEqual(message); - } - // publish normal version - // publish 1.4.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const infoResp = await npmUtils.getInfoVersions(npm, `${pkgName}@1.4.0`, registry); - // must be not deprecated - expect(infoResp.deprecated).toBeUndefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runDeprecate(npm); }); diff --git a/e2e/cli/e2e-npm10/dist-tags.spec.ts b/e2e/cli/e2e-npm10/dist-tags.spec.ts index 1c9ac76..7a55089 100644 --- a/e2e/cli/e2e-npm10/dist-tags.spec.ts +++ b/e2e/cli/e2e-npm10/dist-tags.spec.ts @@ -1,91 +1,9 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { npm } from './utils'; - -describe('publish a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); +import { runDistTag } from '@verdaccio/e2e-cli-npm-common'; - test.each([['@foo/foo', 'foo']])('should list dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'ls', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('beta: 1.1.0latest: 1.0.0'); - }); - - test.each([['@verdaccio/bar']])('should remove tag with dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'rm', - `${pkgName}@1.1.0`, - 'beta', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('-beta: @verdaccio/bar@1.1.0'); - }); - - test.each([['@verdaccio/five']])( - 'should add tag to package and version with dist-tags for %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'add', - `${pkgName}@1.1.0`, - 'alfa', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual(`+alfa: ${pkgName}@1.1.0`); - } - ); +import { npm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('dist-tags a package', () => { + runDistTag(npm); }); diff --git a/e2e/cli/e2e-npm10/info.spec.ts b/e2e/cli/e2e-npm10/info.spec.ts index 2b11a11..d110beb 100644 --- a/e2e/cli/e2e-npm10/info.spec.ts +++ b/e2e/cli/e2e-npm10/info.spec.ts @@ -1,31 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { npm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; +import { runInfo } from '@verdaccio/e2e-cli-npm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run npm info json body', async () => { - const resp = await npm( - {}, - 'info', - 'verdaccio', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual('verdaccio'); - expect(parsedBody.dependencies).toBeDefined(); - }); +import { npm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('info a package', () => { + runInfo(npm); }); diff --git a/e2e/cli/e2e-npm10/install.spec.ts b/e2e/cli/e2e-npm10/install.spec.ts index 2b15921..8737ecc 100644 --- a/e2e/cli/e2e-npm10/install.spec.ts +++ b/e2e/cli/e2e-npm10/install.spec.ts @@ -1,38 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runInstall } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('install a project packages', () => { - jest.setTimeout(100000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run npm install json body', async () => { - const { tempFolder } = await prepareGenericEmptyProject( - 'something', - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { react: '18.2.0' } - ); - const resp = await npm( - { cwd: tempFolder }, - 'install', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.added).toBeDefined(); - expect(parsedBody.audit).toBeDefined(); - }); - - afterAll(async () => { - registry.stop(); - }); + runInstall(npm); }); diff --git a/e2e/cli/e2e-npm10/jest.config.js b/e2e/cli/e2e-npm10/jest.config.js deleted file mode 100644 index cd97591..0000000 --- a/e2e/cli/e2e-npm10/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../jest.config'); - -module.exports = { ...config }; diff --git a/e2e/cli/e2e-npm10/package.json b/e2e/cli/e2e-npm10/package.json index 892527b..7021c4a 100644 --- a/e2e/cli/e2e-npm10/package.json +++ b/e2e/cli/e2e-npm10/package.json @@ -1,12 +1,13 @@ { "private": true, "name": "@verdaccio/e2e-cli-npm9", - "version": "1.0.1-6-next.5", + "version": "1.0.1", "dependencies": { - "@verdaccio/test-cli-commons": "workspace:1.0.1-6-next.5", - "npm": "next-10" + "@verdaccio/test-cli-commons": "workspace:*", + "@verdaccio/e2e-cli-npm-common": "workspace:*", + "npm": "10.9.2" }, "scripts": { - "test": "jest" + "test": "vitest run --testTimeout 50000" } } diff --git a/e2e/cli/e2e-npm10/ping.spec.ts b/e2e/cli/e2e-npm10/ping.spec.ts index 37edf9c..8dc511b 100644 --- a/e2e/cli/e2e-npm10/ping.spec.ts +++ b/e2e/cli/e2e-npm10/ping.spec.ts @@ -1,24 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runPing } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('ping registry', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should ping registry', async () => { - const resp = await npm({}, 'ping', '--json', ...addRegistry(registry.getRegistryUrl())); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.registry).toEqual(registry.getRegistryUrl() + '/'); - }); - - afterAll(async () => { - registry.stop(); - }); + runPing(npm); }); diff --git a/e2e/cli/e2e-npm10/publish.spec.ts b/e2e/cli/e2e-npm10/publish.spec.ts index ed137ec..d5efcc7 100644 --- a/e2e/cli/e2e-npm10/publish.spec.ts +++ b/e2e/cli/e2e-npm10/publish.spec.ts @@ -1,41 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { npm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; +import { runPublish } from '@verdaccio/e2e-cli-npm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', 'verdaccio', '@verdaccio/foo', '@verdaccio/some-foo']])( - 'should publish a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - const resp = await npm( - { cwd: tempFolder }, - 'publish', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); - expect(parsedBody.files).toBeDefined(); - expect(parsedBody.files).toBeDefined(); - } - ); +import { npm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('publish a package', () => { + runPublish(npm); }); diff --git a/e2e/cli/e2e-npm10/search.spec.ts b/e2e/cli/e2e-npm10/search.spec.ts index c62ba1b..1f76a09 100644 --- a/e2e/cli/e2e-npm10/search.spec.ts +++ b/e2e/cli/e2e-npm10/search.spec.ts @@ -1,33 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runSearch } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('search a package', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should search a package', async () => { - const resp = await npm( - {}, - 'search', - '@verdaccio/cli', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - const pkgFind = parsedBody.find((item) => { - return item.name === '@verdaccio/cli'; - }); - expect(pkgFind.name).toEqual('@verdaccio/cli'); - }); - - afterAll(async () => { - registry.stop(); - }); + runSearch(npm); }); diff --git a/e2e/cli/e2e-npm10/star.spec.ts b/e2e/cli/e2e-npm10/star.spec.ts index 9f1b75b..4d3bda0 100644 --- a/e2e/cli/e2e-npm10/star.spec.ts +++ b/e2e/cli/e2e-npm10/star.spec.ts @@ -1,85 +1,9 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runStar } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('star a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/foo']])('should star a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp = await npm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - }); - - test.each([['@verdaccio/bar']])('should unstar a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp = await npm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - - const resp1 = await npm( - { cwd: tempFolder }, - 'unstar', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp1.stdout).toEqual(`☆ ${pkgName}`); - }); - - test('should list stars of a user %s', async () => { - const pkgName = '@verdaccio/stars'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npm({ cwd: tempFolder }, 'star', pkgName, ...addRegistry(registry.getRegistryUrl())); - const resp = await npm({ cwd: tempFolder }, 'stars', ...addRegistry(registry.getRegistryUrl())); - // side effects: this result is affected the the package published in the previous step - expect(resp.stdout).toEqual(`@verdaccio/foo@verdaccio/stars`); - }); - - afterAll(async () => { - registry.stop(); - }); + runStar(npm); }); diff --git a/e2e/cli/e2e-npm10/tsconfig.json b/e2e/cli/e2e-npm10/tsconfig.json index 85f4cec..a1310f1 100644 --- a/e2e/cli/e2e-npm10/tsconfig.json +++ b/e2e/cli/e2e-npm10/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "../../../tsconfig.reference.json", - "references": [ - { - "path": "../cli-commons" - } - ] + "extends": "../../../tsconfig.reference.json" } diff --git a/e2e/cli/e2e-npm10/unpublish.spec.ts b/e2e/cli/e2e-npm10/unpublish.spec.ts index ef647dd..9018679 100644 --- a/e2e/cli/e2e-npm10/unpublish.spec.ts +++ b/e2e/cli/e2e-npm10/unpublish.spec.ts @@ -1,57 +1,9 @@ -import fs from 'fs'; -import path from 'path'; +import { describe } from 'vitest'; -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { runUnpublish } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('unpublish a package', () => { - jest.setTimeout(20000); - let registry; - let registryStorageFolder; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - registryStorageFolder = setup.tempFolder; - }); - - test.each(['foo-memory', '@scope/foo-memory'])( - 'should unpublish a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - const resp = await npm( - { cwd: tempFolder }, - 'publish', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); - expect(parsedBody.files).toBeDefined(); - expect(parsedBody.files).toBeDefined(); - - await npm( - { cwd: tempFolder }, - 'unpublish', - '--json', - '--force', - ...addRegistry(registry.getRegistryUrl()) - ); - const pkgFolder = fs.existsSync(path.join(registryStorageFolder, 'storage', pkgName)); - expect(pkgFolder).toBeFalsy(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runUnpublish(npm); }); diff --git a/e2e/cli/e2e-npm6/audit.spec.ts b/e2e/cli/e2e-npm6/audit.spec.ts deleted file mode 100644 index 566edcf..0000000 --- a/e2e/cli/e2e-npm6/audit.spec.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; - -import { npm } from './utils'; - -describe('audit a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', '@verdaccio/cli']])( - 'should audit a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { jquery: '3.6.1' } - ); - // install is required to create package lock file - await npm({ cwd: tempFolder }, 'install', ...addRegistry(registry.getRegistryUrl())); - const resp = await npm( - { cwd: tempFolder }, - 'audit', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.metadata).toBeDefined(); - expect(parsedBody.actions).toBeDefined(); - expect(parsedBody.advisories).toBeDefined(); - expect(parsedBody.muted).toBeDefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-npm6/deprecate.spec.ts b/e2e/cli/e2e-npm6/deprecate.spec.ts deleted file mode 100644 index 9855138..0000000 --- a/e2e/cli/e2e-npm6/deprecate.spec.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; - -import { npm } from './utils'; - -describe('deprecate a package', () => { - jest.setTimeout(20000); - let registry; - - async function deprecate(tempFolder, packageVersion, registry, message) { - await npm( - { cwd: tempFolder }, - 'deprecate', - packageVersion, - message, - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - } - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/deprecated-1']])( - 'should deprecate a single package %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody.name).toEqual(pkgName); - expect(infoBody.deprecated).toEqual(message); - } - ); - - test.each([['@verdaccio/deprecated-2']])('should un-deprecate a package %s', async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody.deprecated).toEqual(message); - // empty string is same as undeprecate - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, ''); - const infoBody2 = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody2.deprecated).toBeUndefined(); - }); - - test.each([['@verdaccio/deprecated-3']])( - 'should deprecate a multiple packages %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - // publish 1.0.0 - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.1.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.2.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.3.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // // deprecate all version - await deprecate(tempFolder, pkgName, registry, message); - // verify is deprecated - for (let v of ['1.0.0', '1.1.0', '1.2.0', '1.3.0']) { - const infoResp = await npmUtils.getInfoVersions(npm, `${pkgName}@${v}`, registry); - expect(infoResp.deprecated).toEqual(message); - } - // publish normal version - // publish 1.4.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const infoResp = await npmUtils.getInfoVersions(npm, `${pkgName}@1.4.0`, registry); - // must be not deprecated - expect(infoResp.deprecated).toBeUndefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-npm6/dist-tags.spec.ts b/e2e/cli/e2e-npm6/dist-tags.spec.ts deleted file mode 100644 index 1c9ac76..0000000 --- a/e2e/cli/e2e-npm6/dist-tags.spec.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; - -import { npm } from './utils'; - -describe('publish a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@foo/foo', 'foo']])('should list dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'ls', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('beta: 1.1.0latest: 1.0.0'); - }); - - test.each([['@verdaccio/bar']])('should remove tag with dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'rm', - `${pkgName}@1.1.0`, - 'beta', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('-beta: @verdaccio/bar@1.1.0'); - }); - - test.each([['@verdaccio/five']])( - 'should add tag to package and version with dist-tags for %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'add', - `${pkgName}@1.1.0`, - 'alfa', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual(`+alfa: ${pkgName}@1.1.0`); - } - ); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-npm6/info.spec.ts b/e2e/cli/e2e-npm6/info.spec.ts deleted file mode 100644 index 6fafc7e..0000000 --- a/e2e/cli/e2e-npm6/info.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; - -import { npm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run npm info json body', async () => { - const resp = await npm( - {}, - 'info', - 'verdaccio', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual('verdaccio'); - expect(parsedBody.dependencies).toBeDefined(); - }); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-npm6/install.spec.ts b/e2e/cli/e2e-npm6/install.spec.ts deleted file mode 100644 index 2ac8230..0000000 --- a/e2e/cli/e2e-npm6/install.spec.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; - -import { npm } from './utils'; - -describe('install a project packages', () => { - jest.setTimeout(80000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run npm install json body', async () => { - const { tempFolder } = await prepareGenericEmptyProject( - 'something', - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { react: '18.2.0' } - ); - const resp = await npm( - { cwd: tempFolder }, - 'install', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.added).toBeDefined(); - expect(parsedBody.audit).toBeDefined(); - }); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-npm6/jest.config.js b/e2e/cli/e2e-npm6/jest.config.js deleted file mode 100644 index cd97591..0000000 --- a/e2e/cli/e2e-npm6/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../jest.config'); - -module.exports = { ...config }; diff --git a/e2e/cli/e2e-npm6/package.json b/e2e/cli/e2e-npm6/package.json deleted file mode 100644 index 969761c..0000000 --- a/e2e/cli/e2e-npm6/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "private": true, - "name": "@verdaccio/e2e-cli-npm6", - "version": "1.0.1-6-next.5", - "dependencies": { - "@verdaccio/test-cli-commons": "workspace:1.0.1-6-next.5", - "npm": "next-6" - }, - "scripts": { - "test": "jest" - } -} diff --git a/e2e/cli/e2e-npm6/ping.spec.ts b/e2e/cli/e2e-npm6/ping.spec.ts deleted file mode 100644 index c14c8f9..0000000 --- a/e2e/cli/e2e-npm6/ping.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; - -import { npm } from './utils'; - -describe('ping registry', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should ping registry', async () => { - const resp = await npm({}, 'ping', '--json', ...addRegistry(registry.getRegistryUrl())); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.registry).toEqual(registry.getRegistryUrl() + '/'); - }); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-npm6/publish.spec.ts b/e2e/cli/e2e-npm6/publish.spec.ts deleted file mode 100644 index 3c4dc5d..0000000 --- a/e2e/cli/e2e-npm6/publish.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; - -import { npm } from './utils'; - -describe('publish a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', 'verdaccio', '@verdaccio/foo', '@verdaccio/some-foo']])( - 'should publish a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - const resp = await npm( - { cwd: tempFolder }, - 'publish', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); - expect(parsedBody.files).toBeDefined(); - expect(parsedBody.files).toBeDefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-npm6/search.spec.ts b/e2e/cli/e2e-npm6/search.spec.ts deleted file mode 100644 index a687451..0000000 --- a/e2e/cli/e2e-npm6/search.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; - -import { npm } from './utils'; - -describe('search a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should search a package', async () => { - const resp = await npm( - {}, - 'search', - '@verdaccio/cli', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - const pkgFind = parsedBody.find((item) => { - return item.name === '@verdaccio/cli'; - }); - expect(pkgFind.name).toEqual('@verdaccio/cli'); - }); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-npm6/star.spec.ts b/e2e/cli/e2e-npm6/star.spec.ts deleted file mode 100644 index 9f1b75b..0000000 --- a/e2e/cli/e2e-npm6/star.spec.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; - -import { npm } from './utils'; - -describe('star a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/foo']])('should star a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp = await npm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - }); - - test.each([['@verdaccio/bar']])('should unstar a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp = await npm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - - const resp1 = await npm( - { cwd: tempFolder }, - 'unstar', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp1.stdout).toEqual(`☆ ${pkgName}`); - }); - - test('should list stars of a user %s', async () => { - const pkgName = '@verdaccio/stars'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npm({ cwd: tempFolder }, 'star', pkgName, ...addRegistry(registry.getRegistryUrl())); - const resp = await npm({ cwd: tempFolder }, 'stars', ...addRegistry(registry.getRegistryUrl())); - // side effects: this result is affected the the package published in the previous step - expect(resp.stdout).toEqual(`@verdaccio/foo@verdaccio/stars`); - }); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-npm6/tsconfig.json b/e2e/cli/e2e-npm6/tsconfig.json deleted file mode 100644 index 85f4cec..0000000 --- a/e2e/cli/e2e-npm6/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../../../tsconfig.reference.json", - "references": [ - { - "path": "../cli-commons" - } - ] -} diff --git a/e2e/cli/e2e-npm6/unpublish.spec.ts b/e2e/cli/e2e-npm6/unpublish.spec.ts deleted file mode 100644 index ef647dd..0000000 --- a/e2e/cli/e2e-npm6/unpublish.spec.ts +++ /dev/null @@ -1,57 +0,0 @@ -import fs from 'fs'; -import path from 'path'; - -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; - -import { npm } from './utils'; - -describe('unpublish a package', () => { - jest.setTimeout(20000); - let registry; - let registryStorageFolder; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - registryStorageFolder = setup.tempFolder; - }); - - test.each(['foo-memory', '@scope/foo-memory'])( - 'should unpublish a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - const resp = await npm( - { cwd: tempFolder }, - 'publish', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); - expect(parsedBody.files).toBeDefined(); - expect(parsedBody.files).toBeDefined(); - - await npm( - { cwd: tempFolder }, - 'unpublish', - '--json', - '--force', - ...addRegistry(registry.getRegistryUrl()) - ); - const pkgFolder = fs.existsSync(path.join(registryStorageFolder, 'storage', pkgName)); - expect(pkgFolder).toBeFalsy(); - } - ); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-npm6/utils.ts b/e2e/cli/e2e-npm6/utils.ts deleted file mode 100644 index 7a6b408..0000000 --- a/e2e/cli/e2e-npm6/utils.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { SpawnOptions } from 'child_process'; -import { join } from 'path'; - -import { exec } from '@verdaccio/test-cli-commons'; - -export function getCommand() { - return join(__dirname, './node_modules/.bin/npm'); -} - -export function npm(options: SpawnOptions, ...args: string[]) { - return exec(options, getCommand(), args); -} diff --git a/e2e/cli/e2e-npm7/CHANGELOG.md b/e2e/cli/e2e-npm7/CHANGELOG.md index c190bcb..3d171ba 100644 --- a/e2e/cli/e2e-npm7/CHANGELOG.md +++ b/e2e/cli/e2e-npm7/CHANGELOG.md @@ -1,5 +1,36 @@ # @verdaccio/e2e-cli-npm7 +## 1.0.2-next-8.0 + +### Patch Changes + +- Updated dependencies + - @verdaccio/test-cli-commons@2.0.0-next-8.0 + +## 1.0.1 + +### Patch Changes + +- 351aeeaa8: fix(deps): @verdaccio/utils should be a prod dep of local-storage +- Updated dependencies [351aeeaa8] +- Updated dependencies [d167f92e1] +- Updated dependencies [c383eb68c] + - @verdaccio/test-cli-commons@1.1.0 + +## 1.0.1-6-next.7 + +### Patch Changes + +- Updated dependencies [c383eb68] + - @verdaccio/test-cli-commons@1.1.0-6-next.7 + +## 1.0.1-6-next.6 + +### Patch Changes + +- Updated dependencies [d167f92e] + - @verdaccio/test-cli-commons@1.1.0-6-next.6 + ## 1.0.1-6-next.5 ### Patch Changes diff --git a/e2e/cli/e2e-npm7/audit.spec.ts b/e2e/cli/e2e-npm7/audit.spec.ts index b2ecf2d..f54f746 100644 --- a/e2e/cli/e2e-npm7/audit.spec.ts +++ b/e2e/cli/e2e-npm7/audit.spec.ts @@ -1,44 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runAudit } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('audit a package', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', '@verdaccio/cli']])( - 'should audit a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { jquery: '3.6.1' } - ); - // install is required to create package lock file - await npm({ cwd: tempFolder }, 'install', ...addRegistry(registry.getRegistryUrl())); - const resp = await npm( - { cwd: tempFolder }, - 'audit', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.metadata).toBeDefined(); - expect(parsedBody.auditReportVersion).toBeDefined(); - expect(parsedBody.vulnerabilities).toBeDefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runAudit(npm); }); diff --git a/e2e/cli/e2e-npm7/deprecate.spec.ts b/e2e/cli/e2e-npm7/deprecate.spec.ts index 9855138..8ff989f 100644 --- a/e2e/cli/e2e-npm7/deprecate.spec.ts +++ b/e2e/cli/e2e-npm7/deprecate.spec.ts @@ -1,115 +1,9 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runDeprecate } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('deprecate a package', () => { - jest.setTimeout(20000); - let registry; - - async function deprecate(tempFolder, packageVersion, registry, message) { - await npm( - { cwd: tempFolder }, - 'deprecate', - packageVersion, - message, - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - } - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/deprecated-1']])( - 'should deprecate a single package %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody.name).toEqual(pkgName); - expect(infoBody.deprecated).toEqual(message); - } - ); - - test.each([['@verdaccio/deprecated-2']])('should un-deprecate a package %s', async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody.deprecated).toEqual(message); - // empty string is same as undeprecate - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, ''); - const infoBody2 = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody2.deprecated).toBeUndefined(); - }); - - test.each([['@verdaccio/deprecated-3']])( - 'should deprecate a multiple packages %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - // publish 1.0.0 - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.1.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.2.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.3.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // // deprecate all version - await deprecate(tempFolder, pkgName, registry, message); - // verify is deprecated - for (let v of ['1.0.0', '1.1.0', '1.2.0', '1.3.0']) { - const infoResp = await npmUtils.getInfoVersions(npm, `${pkgName}@${v}`, registry); - expect(infoResp.deprecated).toEqual(message); - } - // publish normal version - // publish 1.4.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const infoResp = await npmUtils.getInfoVersions(npm, `${pkgName}@1.4.0`, registry); - // must be not deprecated - expect(infoResp.deprecated).toBeUndefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runDeprecate(npm); }); diff --git a/e2e/cli/e2e-npm7/dist-tags.spec.ts b/e2e/cli/e2e-npm7/dist-tags.spec.ts index 1c9ac76..7a55089 100644 --- a/e2e/cli/e2e-npm7/dist-tags.spec.ts +++ b/e2e/cli/e2e-npm7/dist-tags.spec.ts @@ -1,91 +1,9 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { npm } from './utils'; - -describe('publish a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); +import { runDistTag } from '@verdaccio/e2e-cli-npm-common'; - test.each([['@foo/foo', 'foo']])('should list dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'ls', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('beta: 1.1.0latest: 1.0.0'); - }); - - test.each([['@verdaccio/bar']])('should remove tag with dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'rm', - `${pkgName}@1.1.0`, - 'beta', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('-beta: @verdaccio/bar@1.1.0'); - }); - - test.each([['@verdaccio/five']])( - 'should add tag to package and version with dist-tags for %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'add', - `${pkgName}@1.1.0`, - 'alfa', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual(`+alfa: ${pkgName}@1.1.0`); - } - ); +import { npm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('dist-tags a package', () => { + runDistTag(npm); }); diff --git a/e2e/cli/e2e-npm7/info.spec.ts b/e2e/cli/e2e-npm7/info.spec.ts index 2b11a11..d110beb 100644 --- a/e2e/cli/e2e-npm7/info.spec.ts +++ b/e2e/cli/e2e-npm7/info.spec.ts @@ -1,31 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { npm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; +import { runInfo } from '@verdaccio/e2e-cli-npm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run npm info json body', async () => { - const resp = await npm( - {}, - 'info', - 'verdaccio', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual('verdaccio'); - expect(parsedBody.dependencies).toBeDefined(); - }); +import { npm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('info a package', () => { + runInfo(npm); }); diff --git a/e2e/cli/e2e-npm7/install.spec.ts b/e2e/cli/e2e-npm7/install.spec.ts index 2ac8230..8737ecc 100644 --- a/e2e/cli/e2e-npm7/install.spec.ts +++ b/e2e/cli/e2e-npm7/install.spec.ts @@ -1,38 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runInstall } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('install a project packages', () => { - jest.setTimeout(80000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run npm install json body', async () => { - const { tempFolder } = await prepareGenericEmptyProject( - 'something', - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { react: '18.2.0' } - ); - const resp = await npm( - { cwd: tempFolder }, - 'install', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.added).toBeDefined(); - expect(parsedBody.audit).toBeDefined(); - }); - - afterAll(async () => { - registry.stop(); - }); + runInstall(npm); }); diff --git a/e2e/cli/e2e-npm7/jest.config.js b/e2e/cli/e2e-npm7/jest.config.js deleted file mode 100644 index cd97591..0000000 --- a/e2e/cli/e2e-npm7/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../jest.config'); - -module.exports = { ...config }; diff --git a/e2e/cli/e2e-npm7/package.json b/e2e/cli/e2e-npm7/package.json index 4df4b27..db3bea2 100644 --- a/e2e/cli/e2e-npm7/package.json +++ b/e2e/cli/e2e-npm7/package.json @@ -1,12 +1,13 @@ { "private": true, "name": "@verdaccio/e2e-cli-npm7", - "version": "1.0.1-6-next.5", + "version": "1.0.2-next-8.0", "dependencies": { - "@verdaccio/test-cli-commons": "workspace:1.0.1-6-next.5", - "npm": "next-7" + "@verdaccio/test-cli-commons": "workspace:*", + "@verdaccio/e2e-cli-npm-common": "workspace:*", + "npm": "7.24.2" }, "scripts": { - "test": "jest" + "test": "vitest run --testTimeout 50000" } } diff --git a/e2e/cli/e2e-npm7/ping.spec.ts b/e2e/cli/e2e-npm7/ping.spec.ts index 37edf9c..8dc511b 100644 --- a/e2e/cli/e2e-npm7/ping.spec.ts +++ b/e2e/cli/e2e-npm7/ping.spec.ts @@ -1,24 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runPing } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('ping registry', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should ping registry', async () => { - const resp = await npm({}, 'ping', '--json', ...addRegistry(registry.getRegistryUrl())); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.registry).toEqual(registry.getRegistryUrl() + '/'); - }); - - afterAll(async () => { - registry.stop(); - }); + runPing(npm); }); diff --git a/e2e/cli/e2e-npm7/publish.spec.ts b/e2e/cli/e2e-npm7/publish.spec.ts index 34ddcac..d5efcc7 100644 --- a/e2e/cli/e2e-npm7/publish.spec.ts +++ b/e2e/cli/e2e-npm7/publish.spec.ts @@ -1,41 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { npm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(20000); - let registry; +import { runPublish } from '@verdaccio/e2e-cli-npm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', 'verdaccio', '@verdaccio/foo', '@verdaccio/some-foo']])( - 'should publish a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - const resp = await npm( - { cwd: tempFolder }, - 'publish', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); - expect(parsedBody.files).toBeDefined(); - expect(parsedBody.files).toBeDefined(); - } - ); +import { npm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('publish a package', () => { + runPublish(npm); }); diff --git a/e2e/cli/e2e-npm7/search.spec.ts b/e2e/cli/e2e-npm7/search.spec.ts index c62ba1b..1f76a09 100644 --- a/e2e/cli/e2e-npm7/search.spec.ts +++ b/e2e/cli/e2e-npm7/search.spec.ts @@ -1,33 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runSearch } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('search a package', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should search a package', async () => { - const resp = await npm( - {}, - 'search', - '@verdaccio/cli', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - const pkgFind = parsedBody.find((item) => { - return item.name === '@verdaccio/cli'; - }); - expect(pkgFind.name).toEqual('@verdaccio/cli'); - }); - - afterAll(async () => { - registry.stop(); - }); + runSearch(npm); }); diff --git a/e2e/cli/e2e-npm7/star.spec.ts b/e2e/cli/e2e-npm7/star.spec.ts index 9f1b75b..4d3bda0 100644 --- a/e2e/cli/e2e-npm7/star.spec.ts +++ b/e2e/cli/e2e-npm7/star.spec.ts @@ -1,85 +1,9 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runStar } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('star a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/foo']])('should star a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp = await npm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - }); - - test.each([['@verdaccio/bar']])('should unstar a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp = await npm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - - const resp1 = await npm( - { cwd: tempFolder }, - 'unstar', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp1.stdout).toEqual(`☆ ${pkgName}`); - }); - - test('should list stars of a user %s', async () => { - const pkgName = '@verdaccio/stars'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npm({ cwd: tempFolder }, 'star', pkgName, ...addRegistry(registry.getRegistryUrl())); - const resp = await npm({ cwd: tempFolder }, 'stars', ...addRegistry(registry.getRegistryUrl())); - // side effects: this result is affected the the package published in the previous step - expect(resp.stdout).toEqual(`@verdaccio/foo@verdaccio/stars`); - }); - - afterAll(async () => { - registry.stop(); - }); + runStar(npm); }); diff --git a/e2e/cli/e2e-npm7/tsconfig.json b/e2e/cli/e2e-npm7/tsconfig.json index 85f4cec..a1310f1 100644 --- a/e2e/cli/e2e-npm7/tsconfig.json +++ b/e2e/cli/e2e-npm7/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "../../../tsconfig.reference.json", - "references": [ - { - "path": "../cli-commons" - } - ] + "extends": "../../../tsconfig.reference.json" } diff --git a/e2e/cli/e2e-npm7/unpublish.spec.ts b/e2e/cli/e2e-npm7/unpublish.spec.ts index ef647dd..9018679 100644 --- a/e2e/cli/e2e-npm7/unpublish.spec.ts +++ b/e2e/cli/e2e-npm7/unpublish.spec.ts @@ -1,57 +1,9 @@ -import fs from 'fs'; -import path from 'path'; +import { describe } from 'vitest'; -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { runUnpublish } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('unpublish a package', () => { - jest.setTimeout(20000); - let registry; - let registryStorageFolder; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - registryStorageFolder = setup.tempFolder; - }); - - test.each(['foo-memory', '@scope/foo-memory'])( - 'should unpublish a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - const resp = await npm( - { cwd: tempFolder }, - 'publish', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); - expect(parsedBody.files).toBeDefined(); - expect(parsedBody.files).toBeDefined(); - - await npm( - { cwd: tempFolder }, - 'unpublish', - '--json', - '--force', - ...addRegistry(registry.getRegistryUrl()) - ); - const pkgFolder = fs.existsSync(path.join(registryStorageFolder, 'storage', pkgName)); - expect(pkgFolder).toBeFalsy(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runUnpublish(npm); }); diff --git a/e2e/cli/e2e-npm8/CHANGELOG.md b/e2e/cli/e2e-npm8/CHANGELOG.md index 2d74c2c..e376de5 100644 --- a/e2e/cli/e2e-npm8/CHANGELOG.md +++ b/e2e/cli/e2e-npm8/CHANGELOG.md @@ -1,5 +1,36 @@ # @verdaccio/e2e-cli-npm8 +## 1.0.2-next-8.0 + +### Patch Changes + +- Updated dependencies + - @verdaccio/test-cli-commons@2.0.0-next-8.0 + +## 1.0.1 + +### Patch Changes + +- 351aeeaa8: fix(deps): @verdaccio/utils should be a prod dep of local-storage +- Updated dependencies [351aeeaa8] +- Updated dependencies [d167f92e1] +- Updated dependencies [c383eb68c] + - @verdaccio/test-cli-commons@1.1.0 + +## 1.0.1-6-next.7 + +### Patch Changes + +- Updated dependencies [c383eb68] + - @verdaccio/test-cli-commons@1.1.0-6-next.7 + +## 1.0.1-6-next.6 + +### Patch Changes + +- Updated dependencies [d167f92e] + - @verdaccio/test-cli-commons@1.1.0-6-next.6 + ## 1.0.1-6-next.5 ### Patch Changes diff --git a/e2e/cli/e2e-npm8/audit.spec.ts b/e2e/cli/e2e-npm8/audit.spec.ts index f9c90d3..f54f746 100644 --- a/e2e/cli/e2e-npm8/audit.spec.ts +++ b/e2e/cli/e2e-npm8/audit.spec.ts @@ -1,44 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runAudit } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('audit a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', '@verdaccio/cli']])( - 'should audit a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { jquery: '3.6.1' } - ); - // install is required to create package lock file - await npm({ cwd: tempFolder }, 'install', ...addRegistry(registry.getRegistryUrl())); - const resp = await npm( - { cwd: tempFolder }, - 'audit', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.metadata).toBeDefined(); - expect(parsedBody.auditReportVersion).toBeDefined(); - expect(parsedBody.vulnerabilities).toBeDefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runAudit(npm); }); diff --git a/e2e/cli/e2e-npm8/deprecate.spec.ts b/e2e/cli/e2e-npm8/deprecate.spec.ts index 9855138..8ff989f 100644 --- a/e2e/cli/e2e-npm8/deprecate.spec.ts +++ b/e2e/cli/e2e-npm8/deprecate.spec.ts @@ -1,115 +1,9 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runDeprecate } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('deprecate a package', () => { - jest.setTimeout(20000); - let registry; - - async function deprecate(tempFolder, packageVersion, registry, message) { - await npm( - { cwd: tempFolder }, - 'deprecate', - packageVersion, - message, - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - } - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/deprecated-1']])( - 'should deprecate a single package %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody.name).toEqual(pkgName); - expect(infoBody.deprecated).toEqual(message); - } - ); - - test.each([['@verdaccio/deprecated-2']])('should un-deprecate a package %s', async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody.deprecated).toEqual(message); - // empty string is same as undeprecate - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, ''); - const infoBody2 = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody2.deprecated).toBeUndefined(); - }); - - test.each([['@verdaccio/deprecated-3']])( - 'should deprecate a multiple packages %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - // publish 1.0.0 - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.1.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.2.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.3.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // // deprecate all version - await deprecate(tempFolder, pkgName, registry, message); - // verify is deprecated - for (let v of ['1.0.0', '1.1.0', '1.2.0', '1.3.0']) { - const infoResp = await npmUtils.getInfoVersions(npm, `${pkgName}@${v}`, registry); - expect(infoResp.deprecated).toEqual(message); - } - // publish normal version - // publish 1.4.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const infoResp = await npmUtils.getInfoVersions(npm, `${pkgName}@1.4.0`, registry); - // must be not deprecated - expect(infoResp.deprecated).toBeUndefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runDeprecate(npm); }); diff --git a/e2e/cli/e2e-npm8/dist-tags.spec.ts b/e2e/cli/e2e-npm8/dist-tags.spec.ts index 1c9ac76..7a55089 100644 --- a/e2e/cli/e2e-npm8/dist-tags.spec.ts +++ b/e2e/cli/e2e-npm8/dist-tags.spec.ts @@ -1,91 +1,9 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { npm } from './utils'; - -describe('publish a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); +import { runDistTag } from '@verdaccio/e2e-cli-npm-common'; - test.each([['@foo/foo', 'foo']])('should list dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'ls', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('beta: 1.1.0latest: 1.0.0'); - }); - - test.each([['@verdaccio/bar']])('should remove tag with dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'rm', - `${pkgName}@1.1.0`, - 'beta', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('-beta: @verdaccio/bar@1.1.0'); - }); - - test.each([['@verdaccio/five']])( - 'should add tag to package and version with dist-tags for %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'add', - `${pkgName}@1.1.0`, - 'alfa', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual(`+alfa: ${pkgName}@1.1.0`); - } - ); +import { npm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('dist-tags a package', () => { + runDistTag(npm); }); diff --git a/e2e/cli/e2e-npm8/info.spec.ts b/e2e/cli/e2e-npm8/info.spec.ts index 2b11a11..d110beb 100644 --- a/e2e/cli/e2e-npm8/info.spec.ts +++ b/e2e/cli/e2e-npm8/info.spec.ts @@ -1,31 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { npm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; +import { runInfo } from '@verdaccio/e2e-cli-npm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run npm info json body', async () => { - const resp = await npm( - {}, - 'info', - 'verdaccio', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual('verdaccio'); - expect(parsedBody.dependencies).toBeDefined(); - }); +import { npm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('info a package', () => { + runInfo(npm); }); diff --git a/e2e/cli/e2e-npm8/install.spec.ts b/e2e/cli/e2e-npm8/install.spec.ts index 2b15921..8737ecc 100644 --- a/e2e/cli/e2e-npm8/install.spec.ts +++ b/e2e/cli/e2e-npm8/install.spec.ts @@ -1,38 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runInstall } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('install a project packages', () => { - jest.setTimeout(100000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run npm install json body', async () => { - const { tempFolder } = await prepareGenericEmptyProject( - 'something', - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { react: '18.2.0' } - ); - const resp = await npm( - { cwd: tempFolder }, - 'install', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.added).toBeDefined(); - expect(parsedBody.audit).toBeDefined(); - }); - - afterAll(async () => { - registry.stop(); - }); + runInstall(npm); }); diff --git a/e2e/cli/e2e-npm8/jest.config.js b/e2e/cli/e2e-npm8/jest.config.js deleted file mode 100644 index cd97591..0000000 --- a/e2e/cli/e2e-npm8/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../jest.config'); - -module.exports = { ...config }; diff --git a/e2e/cli/e2e-npm8/package.json b/e2e/cli/e2e-npm8/package.json index 2f74b4d..37ff25c 100644 --- a/e2e/cli/e2e-npm8/package.json +++ b/e2e/cli/e2e-npm8/package.json @@ -1,12 +1,13 @@ { "private": true, "name": "@verdaccio/e2e-cli-npm8", - "version": "1.0.1-6-next.5", + "version": "1.0.2-next-8.0", "dependencies": { - "@verdaccio/test-cli-commons": "workspace:1.0.1-6-next.5", - "npm": "next-8" + "@verdaccio/test-cli-commons": "workspace:*", + "@verdaccio/e2e-cli-npm-common": "workspace:*", + "npm": "8.19.4" }, "scripts": { - "test": "jest" + "test": "vitest run --testTimeout 50000" } } diff --git a/e2e/cli/e2e-npm8/ping.spec.ts b/e2e/cli/e2e-npm8/ping.spec.ts index 37edf9c..8dc511b 100644 --- a/e2e/cli/e2e-npm8/ping.spec.ts +++ b/e2e/cli/e2e-npm8/ping.spec.ts @@ -1,24 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runPing } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('ping registry', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should ping registry', async () => { - const resp = await npm({}, 'ping', '--json', ...addRegistry(registry.getRegistryUrl())); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.registry).toEqual(registry.getRegistryUrl() + '/'); - }); - - afterAll(async () => { - registry.stop(); - }); + runPing(npm); }); diff --git a/e2e/cli/e2e-npm8/publish.spec.ts b/e2e/cli/e2e-npm8/publish.spec.ts index ed137ec..d5efcc7 100644 --- a/e2e/cli/e2e-npm8/publish.spec.ts +++ b/e2e/cli/e2e-npm8/publish.spec.ts @@ -1,41 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { npm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; +import { runPublish } from '@verdaccio/e2e-cli-npm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', 'verdaccio', '@verdaccio/foo', '@verdaccio/some-foo']])( - 'should publish a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - const resp = await npm( - { cwd: tempFolder }, - 'publish', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); - expect(parsedBody.files).toBeDefined(); - expect(parsedBody.files).toBeDefined(); - } - ); +import { npm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('publish a package', () => { + runPublish(npm); }); diff --git a/e2e/cli/e2e-npm8/search.spec.ts b/e2e/cli/e2e-npm8/search.spec.ts index c62ba1b..1f76a09 100644 --- a/e2e/cli/e2e-npm8/search.spec.ts +++ b/e2e/cli/e2e-npm8/search.spec.ts @@ -1,33 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runSearch } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('search a package', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should search a package', async () => { - const resp = await npm( - {}, - 'search', - '@verdaccio/cli', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - const pkgFind = parsedBody.find((item) => { - return item.name === '@verdaccio/cli'; - }); - expect(pkgFind.name).toEqual('@verdaccio/cli'); - }); - - afterAll(async () => { - registry.stop(); - }); + runSearch(npm); }); diff --git a/e2e/cli/e2e-npm8/star.spec.ts b/e2e/cli/e2e-npm8/star.spec.ts index 9f1b75b..4d3bda0 100644 --- a/e2e/cli/e2e-npm8/star.spec.ts +++ b/e2e/cli/e2e-npm8/star.spec.ts @@ -1,85 +1,9 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runStar } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('star a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/foo']])('should star a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp = await npm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - }); - - test.each([['@verdaccio/bar']])('should unstar a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp = await npm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - - const resp1 = await npm( - { cwd: tempFolder }, - 'unstar', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp1.stdout).toEqual(`☆ ${pkgName}`); - }); - - test('should list stars of a user %s', async () => { - const pkgName = '@verdaccio/stars'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npm({ cwd: tempFolder }, 'star', pkgName, ...addRegistry(registry.getRegistryUrl())); - const resp = await npm({ cwd: tempFolder }, 'stars', ...addRegistry(registry.getRegistryUrl())); - // side effects: this result is affected the the package published in the previous step - expect(resp.stdout).toEqual(`@verdaccio/foo@verdaccio/stars`); - }); - - afterAll(async () => { - registry.stop(); - }); + runStar(npm); }); diff --git a/e2e/cli/e2e-npm8/tsconfig.json b/e2e/cli/e2e-npm8/tsconfig.json index 85f4cec..a1310f1 100644 --- a/e2e/cli/e2e-npm8/tsconfig.json +++ b/e2e/cli/e2e-npm8/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "../../../tsconfig.reference.json", - "references": [ - { - "path": "../cli-commons" - } - ] + "extends": "../../../tsconfig.reference.json" } diff --git a/e2e/cli/e2e-npm8/unpublish.spec.ts b/e2e/cli/e2e-npm8/unpublish.spec.ts index ef647dd..9018679 100644 --- a/e2e/cli/e2e-npm8/unpublish.spec.ts +++ b/e2e/cli/e2e-npm8/unpublish.spec.ts @@ -1,57 +1,9 @@ -import fs from 'fs'; -import path from 'path'; +import { describe } from 'vitest'; -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { runUnpublish } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('unpublish a package', () => { - jest.setTimeout(20000); - let registry; - let registryStorageFolder; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - registryStorageFolder = setup.tempFolder; - }); - - test.each(['foo-memory', '@scope/foo-memory'])( - 'should unpublish a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - const resp = await npm( - { cwd: tempFolder }, - 'publish', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); - expect(parsedBody.files).toBeDefined(); - expect(parsedBody.files).toBeDefined(); - - await npm( - { cwd: tempFolder }, - 'unpublish', - '--json', - '--force', - ...addRegistry(registry.getRegistryUrl()) - ); - const pkgFolder = fs.existsSync(path.join(registryStorageFolder, 'storage', pkgName)); - expect(pkgFolder).toBeFalsy(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runUnpublish(npm); }); diff --git a/e2e/cli/e2e-npm9/CHANGELOG.md b/e2e/cli/e2e-npm9/CHANGELOG.md index ff31d6c..263c60d 100644 --- a/e2e/cli/e2e-npm9/CHANGELOG.md +++ b/e2e/cli/e2e-npm9/CHANGELOG.md @@ -1,5 +1,35 @@ # @verdaccio/e2e-cli-npm9 +## 1.0.2-next-8.0 + +### Patch Changes + +- Updated dependencies + - @verdaccio/test-cli-commons@2.0.0-next-8.0 + +## 1.0.1 + +### Patch Changes + +- Updated dependencies [351aeeaa8] +- Updated dependencies [d167f92e1] +- Updated dependencies [c383eb68c] + - @verdaccio/test-cli-commons@1.1.0 + +## 1.0.1-6-next.7 + +### Patch Changes + +- Updated dependencies [c383eb68] + - @verdaccio/test-cli-commons@1.1.0-6-next.7 + +## 1.0.1-6-next.6 + +### Patch Changes + +- Updated dependencies [d167f92e] + - @verdaccio/test-cli-commons@1.1.0-6-next.6 + ## 1.0.1-6-next.5 ### Patch Changes diff --git a/e2e/cli/e2e-npm9/audit.spec.ts b/e2e/cli/e2e-npm9/audit.spec.ts index b2ecf2d..f54f746 100644 --- a/e2e/cli/e2e-npm9/audit.spec.ts +++ b/e2e/cli/e2e-npm9/audit.spec.ts @@ -1,44 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runAudit } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('audit a package', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', '@verdaccio/cli']])( - 'should audit a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { jquery: '3.6.1' } - ); - // install is required to create package lock file - await npm({ cwd: tempFolder }, 'install', ...addRegistry(registry.getRegistryUrl())); - const resp = await npm( - { cwd: tempFolder }, - 'audit', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.metadata).toBeDefined(); - expect(parsedBody.auditReportVersion).toBeDefined(); - expect(parsedBody.vulnerabilities).toBeDefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runAudit(npm); }); diff --git a/e2e/cli/e2e-npm9/deprecate.spec.ts b/e2e/cli/e2e-npm9/deprecate.spec.ts index 9855138..8ff989f 100644 --- a/e2e/cli/e2e-npm9/deprecate.spec.ts +++ b/e2e/cli/e2e-npm9/deprecate.spec.ts @@ -1,115 +1,9 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runDeprecate } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('deprecate a package', () => { - jest.setTimeout(20000); - let registry; - - async function deprecate(tempFolder, packageVersion, registry, message) { - await npm( - { cwd: tempFolder }, - 'deprecate', - packageVersion, - message, - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - } - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/deprecated-1']])( - 'should deprecate a single package %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody.name).toEqual(pkgName); - expect(infoBody.deprecated).toEqual(message); - } - ); - - test.each([['@verdaccio/deprecated-2']])('should un-deprecate a package %s', async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody.deprecated).toEqual(message); - // empty string is same as undeprecate - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, ''); - const infoBody2 = await npmUtils.getInfoVersions(npm, `${pkgName}`, registry); - expect(infoBody2.deprecated).toBeUndefined(); - }); - - test.each([['@verdaccio/deprecated-3']])( - 'should deprecate a multiple packages %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - // publish 1.0.0 - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.1.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.2.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // publish 1.3.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - // // deprecate all version - await deprecate(tempFolder, pkgName, registry, message); - // verify is deprecated - for (let v of ['1.0.0', '1.1.0', '1.2.0', '1.3.0']) { - const infoResp = await npmUtils.getInfoVersions(npm, `${pkgName}@${v}`, registry); - expect(infoResp.deprecated).toEqual(message); - } - // publish normal version - // publish 1.4.0 - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const infoResp = await npmUtils.getInfoVersions(npm, `${pkgName}@1.4.0`, registry); - // must be not deprecated - expect(infoResp.deprecated).toBeUndefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runDeprecate(npm); }); diff --git a/e2e/cli/e2e-npm9/dist-tags.spec.ts b/e2e/cli/e2e-npm9/dist-tags.spec.ts index 1c9ac76..7a55089 100644 --- a/e2e/cli/e2e-npm9/dist-tags.spec.ts +++ b/e2e/cli/e2e-npm9/dist-tags.spec.ts @@ -1,91 +1,9 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { npm } from './utils'; - -describe('publish a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); +import { runDistTag } from '@verdaccio/e2e-cli-npm-common'; - test.each([['@foo/foo', 'foo']])('should list dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'ls', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('beta: 1.1.0latest: 1.0.0'); - }); - - test.each([['@verdaccio/bar']])('should remove tag with dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'rm', - `${pkgName}@1.1.0`, - 'beta', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('-beta: @verdaccio/bar@1.1.0'); - }); - - test.each([['@verdaccio/five']])( - 'should add tag to package and version with dist-tags for %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npmUtils.bumbUp(npm, tempFolder, registry); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp2 = await npm( - { cwd: tempFolder }, - 'dist-tag', - 'add', - `${pkgName}@1.1.0`, - 'alfa', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual(`+alfa: ${pkgName}@1.1.0`); - } - ); +import { npm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('dist-tags a package', () => { + runDistTag(npm); }); diff --git a/e2e/cli/e2e-npm9/info.spec.ts b/e2e/cli/e2e-npm9/info.spec.ts index 2b11a11..d110beb 100644 --- a/e2e/cli/e2e-npm9/info.spec.ts +++ b/e2e/cli/e2e-npm9/info.spec.ts @@ -1,31 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { npm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; +import { runInfo } from '@verdaccio/e2e-cli-npm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run npm info json body', async () => { - const resp = await npm( - {}, - 'info', - 'verdaccio', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual('verdaccio'); - expect(parsedBody.dependencies).toBeDefined(); - }); +import { npm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('info a package', () => { + runInfo(npm); }); diff --git a/e2e/cli/e2e-npm9/install.spec.ts b/e2e/cli/e2e-npm9/install.spec.ts index 2b15921..8737ecc 100644 --- a/e2e/cli/e2e-npm9/install.spec.ts +++ b/e2e/cli/e2e-npm9/install.spec.ts @@ -1,38 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runInstall } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('install a project packages', () => { - jest.setTimeout(100000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run npm install json body', async () => { - const { tempFolder } = await prepareGenericEmptyProject( - 'something', - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { react: '18.2.0' } - ); - const resp = await npm( - { cwd: tempFolder }, - 'install', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.added).toBeDefined(); - expect(parsedBody.audit).toBeDefined(); - }); - - afterAll(async () => { - registry.stop(); - }); + runInstall(npm); }); diff --git a/e2e/cli/e2e-npm9/jest.config.js b/e2e/cli/e2e-npm9/jest.config.js deleted file mode 100644 index cd97591..0000000 --- a/e2e/cli/e2e-npm9/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../jest.config'); - -module.exports = { ...config }; diff --git a/e2e/cli/e2e-npm9/package.json b/e2e/cli/e2e-npm9/package.json index 40bdbbb..0d65770 100644 --- a/e2e/cli/e2e-npm9/package.json +++ b/e2e/cli/e2e-npm9/package.json @@ -1,12 +1,13 @@ { "private": true, "name": "@verdaccio/e2e-cli-npm9", - "version": "1.0.1-6-next.5", + "version": "1.0.2-next-8.0", "dependencies": { - "@verdaccio/test-cli-commons": "workspace:1.0.1-6-next.5", - "npm": "next-9" + "@verdaccio/test-cli-commons": "workspace:*", + "@verdaccio/e2e-cli-npm-common": "workspace:*", + "npm": "9.9.3" }, "scripts": { - "test": "jest" + "test": "vitest run --testTimeout 50000" } } diff --git a/e2e/cli/e2e-npm9/ping.spec.ts b/e2e/cli/e2e-npm9/ping.spec.ts index 37edf9c..8dc511b 100644 --- a/e2e/cli/e2e-npm9/ping.spec.ts +++ b/e2e/cli/e2e-npm9/ping.spec.ts @@ -1,24 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runPing } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('ping registry', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should ping registry', async () => { - const resp = await npm({}, 'ping', '--json', ...addRegistry(registry.getRegistryUrl())); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.registry).toEqual(registry.getRegistryUrl() + '/'); - }); - - afterAll(async () => { - registry.stop(); - }); + runPing(npm); }); diff --git a/e2e/cli/e2e-npm9/publish.spec.ts b/e2e/cli/e2e-npm9/publish.spec.ts index ed137ec..d5efcc7 100644 --- a/e2e/cli/e2e-npm9/publish.spec.ts +++ b/e2e/cli/e2e-npm9/publish.spec.ts @@ -1,41 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { npm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; +import { runPublish } from '@verdaccio/e2e-cli-npm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', 'verdaccio', '@verdaccio/foo', '@verdaccio/some-foo']])( - 'should publish a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - const resp = await npm( - { cwd: tempFolder }, - 'publish', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); - expect(parsedBody.files).toBeDefined(); - expect(parsedBody.files).toBeDefined(); - } - ); +import { npm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('publish a package', () => { + runPublish(npm); }); diff --git a/e2e/cli/e2e-npm9/search.spec.ts b/e2e/cli/e2e-npm9/search.spec.ts index c62ba1b..1f76a09 100644 --- a/e2e/cli/e2e-npm9/search.spec.ts +++ b/e2e/cli/e2e-npm9/search.spec.ts @@ -1,33 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runSearch } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('search a package', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should search a package', async () => { - const resp = await npm( - {}, - 'search', - '@verdaccio/cli', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - const pkgFind = parsedBody.find((item) => { - return item.name === '@verdaccio/cli'; - }); - expect(pkgFind.name).toEqual('@verdaccio/cli'); - }); - - afterAll(async () => { - registry.stop(); - }); + runSearch(npm); }); diff --git a/e2e/cli/e2e-npm9/star.spec.ts b/e2e/cli/e2e-npm9/star.spec.ts index 9f1b75b..4d3bda0 100644 --- a/e2e/cli/e2e-npm9/star.spec.ts +++ b/e2e/cli/e2e-npm9/star.spec.ts @@ -1,85 +1,9 @@ -import { - addRegistry, - initialSetup, - npmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runStar } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('star a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/foo']])('should star a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp = await npm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - }); - - test.each([['@verdaccio/bar']])('should unstar a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await npmUtils.publish(npm, tempFolder, pkgName, registry); - const resp = await npm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - - const resp1 = await npm( - { cwd: tempFolder }, - 'unstar', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp1.stdout).toEqual(`☆ ${pkgName}`); - }); - - test('should list stars of a user %s', async () => { - const pkgName = '@verdaccio/stars'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await npmUtils.publish(npm, tempFolder, pkgName, registry); - await npm({ cwd: tempFolder }, 'star', pkgName, ...addRegistry(registry.getRegistryUrl())); - const resp = await npm({ cwd: tempFolder }, 'stars', ...addRegistry(registry.getRegistryUrl())); - // side effects: this result is affected the the package published in the previous step - expect(resp.stdout).toEqual(`@verdaccio/foo@verdaccio/stars`); - }); - - afterAll(async () => { - registry.stop(); - }); + runStar(npm); }); diff --git a/e2e/cli/e2e-npm9/tsconfig.json b/e2e/cli/e2e-npm9/tsconfig.json index 85f4cec..a5e8431 100644 --- a/e2e/cli/e2e-npm9/tsconfig.json +++ b/e2e/cli/e2e-npm9/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "../../../tsconfig.reference.json", - "references": [ - { - "path": "../cli-commons" - } - ] + "extends": "../../../tsconfig.reference.json" } diff --git a/e2e/cli/e2e-npm9/unpublish.spec.ts b/e2e/cli/e2e-npm9/unpublish.spec.ts index ef647dd..9018679 100644 --- a/e2e/cli/e2e-npm9/unpublish.spec.ts +++ b/e2e/cli/e2e-npm9/unpublish.spec.ts @@ -1,57 +1,9 @@ -import fs from 'fs'; -import path from 'path'; +import { describe } from 'vitest'; -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { runUnpublish } from '@verdaccio/e2e-cli-npm-common'; import { npm } from './utils'; describe('unpublish a package', () => { - jest.setTimeout(20000); - let registry; - let registryStorageFolder; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - registryStorageFolder = setup.tempFolder; - }); - - test.each(['foo-memory', '@scope/foo-memory'])( - 'should unpublish a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - const resp = await npm( - { cwd: tempFolder }, - 'publish', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); - expect(parsedBody.files).toBeDefined(); - expect(parsedBody.files).toBeDefined(); - - await npm( - { cwd: tempFolder }, - 'unpublish', - '--json', - '--force', - ...addRegistry(registry.getRegistryUrl()) - ); - const pkgFolder = fs.existsSync(path.join(registryStorageFolder, 'storage', pkgName)); - expect(pkgFolder).toBeFalsy(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runUnpublish(npm); }); diff --git a/e2e/cli/e2e-pnpm7/.babelrc b/e2e/cli/e2e-pnpm-commons/.babelrc similarity index 100% rename from e2e/cli/e2e-pnpm7/.babelrc rename to e2e/cli/e2e-pnpm-commons/.babelrc diff --git a/e2e/cli/e2e-pnpm7/.eslintrc b/e2e/cli/e2e-pnpm-commons/.eslintrc similarity index 100% rename from e2e/cli/e2e-pnpm7/.eslintrc rename to e2e/cli/e2e-pnpm-commons/.eslintrc diff --git a/e2e/cli/e2e-pnpm-commons/CHANGELOG.md b/e2e/cli/e2e-pnpm-commons/CHANGELOG.md new file mode 100644 index 0000000..4ac7ce3 --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/CHANGELOG.md @@ -0,0 +1,8 @@ +# @verdaccio/e2e-cli-pnpm9 + +## 1.0.2-next-8.0 + +### Patch Changes + +- Updated dependencies + - @verdaccio/test-cli-commons@2.0.0-next-8.0 diff --git a/e2e/cli/e2e-pnpm-commons/audit.ts b/e2e/cli/e2e-pnpm-commons/audit.ts new file mode 100644 index 0000000..67ddab9 --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/audit.ts @@ -0,0 +1,46 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; + +export function runAudit(pnpm) { + describe('audit a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test.each([['verdaccio-memory', '@verdaccio/cli']])( + 'should audit a package %s', + async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-patch', + registry.port, + registry.getToken(), + registry.getRegistryUrl(), + { jquery: '3.6.1' } + ); + // install is required to create package lock file + await pnpm({ cwd: tempFolder }, 'install', ...addRegistry(registry.getRegistryUrl())); + const resp = await pnpm( + { cwd: tempFolder }, + 'audit', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + const parsedBody = JSON.parse(resp.stdout as string); + expect(parsedBody.metadata).toBeDefined(); + expect(parsedBody.actions).toBeDefined(); + expect(parsedBody.advisories).toBeDefined(); + expect(parsedBody.muted).toBeDefined(); + } + ); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-pnpm-commons/deprecate.ts b/e2e/cli/e2e-pnpm-commons/deprecate.ts new file mode 100644 index 0000000..488813e --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/deprecate.ts @@ -0,0 +1,119 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { + addRegistry, + initialSetup, + pnpmUtils, + prepareGenericEmptyProject, +} from '@verdaccio/test-cli-commons'; + +export function runDeprecate(pnpm) { + describe('deprecate a package', () => { + let registry; + + async function deprecate(tempFolder, packageVersion, registry, message) { + await pnpm( + { cwd: tempFolder }, + 'deprecate', + packageVersion, + message, + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + } + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test.each([['@verdaccio/deprecated-1']])( + 'should deprecate a single package %s', + async (pkgName) => { + const message = 'some message'; + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + // deprecate one version + await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); + // verify is deprecated + const infoBody = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}`, registry); + expect(infoBody.name).toEqual(pkgName); + expect(infoBody.deprecated).toEqual(message); + } + ); + + test.each([['@verdaccio/deprecated-2']])( + 'should un-deprecate a package %s', + async (pkgName) => { + const message = 'some message'; + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + // deprecate one version + await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); + // verify is deprecated + const infoBody = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}`, registry); + expect(infoBody.deprecated).toEqual(message); + // empty string is same as undeprecate + await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, ''); + const infoBody2 = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}`, registry); + expect(infoBody2.deprecated).toBeUndefined(); + } + ); + + test.each([['@verdaccio/deprecated-3']])( + 'should deprecate a multiple packages %s', + async (pkgName) => { + const message = 'some message'; + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + // publish 1.0.0 + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + // publish 1.1.0 + await pnpmUtils.bumbUp(pnpm, tempFolder, registry); + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + // publish 1.2.0 + await pnpmUtils.bumbUp(pnpm, tempFolder, registry); + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + // publish 1.3.0 + await pnpmUtils.bumbUp(pnpm, tempFolder, registry); + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + // // deprecate all version + await deprecate(tempFolder, pkgName, registry, message); + // verify is deprecated + for (let v of ['1.0.0', '1.1.0', '1.2.0', '1.3.0']) { + const infoResp = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}@${v}`, registry); + expect(infoResp.deprecated).toEqual(message); + } + // publish normal version + // publish 1.4.0 + await pnpmUtils.bumbUp(pnpm, tempFolder, registry); + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + const infoResp = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}@1.4.0`, registry); + // must be not deprecated + expect(infoResp.deprecated).toBeUndefined(); + } + ); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-pnpm-commons/dist-tags.ts b/e2e/cli/e2e-pnpm-commons/dist-tags.ts new file mode 100644 index 0000000..50da5f2 --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/dist-tags.ts @@ -0,0 +1,92 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { + addRegistry, + initialSetup, + pnpmUtils, + prepareGenericEmptyProject, +} from '@verdaccio/test-cli-commons'; + +export function runDistTag(pnpm) { + describe('publish a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test.each([['@foo/foo', 'foo']])('should list dist-tags for %s', async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + await pnpmUtils.bumbUp(pnpm, tempFolder, registry); + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry, ['--tag', 'beta']); + const resp2 = await pnpm( + { cwd: tempFolder }, + 'dist-tag', + 'ls', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp2.stdout).toEqual('beta: 1.1.0latest: 1.0.0'); + }); + + test.each([['@verdaccio/bar']])('should remove tag with dist-tags for %s', async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + await pnpmUtils.bumbUp(pnpm, tempFolder, registry); + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry, ['--tag', 'beta']); + const resp2 = await pnpm( + { cwd: tempFolder }, + 'dist-tag', + 'rm', + `${pkgName}@1.1.0`, + 'beta', + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp2.stdout).toEqual('-beta: @verdaccio/bar@1.1.0'); + }); + + test.each([['@verdaccio/five']])( + 'should add tag to package and version with dist-tags for %s', + async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + await pnpmUtils.bumbUp(pnpm, tempFolder, registry); + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + const resp2 = await pnpm( + { cwd: tempFolder }, + 'dist-tag', + 'add', + `${pkgName}@1.1.0`, + 'alfa', + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp2.stdout).toEqual(`+alfa: ${pkgName}@1.1.0`); + } + ); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-pnpm-commons/index.ts b/e2e/cli/e2e-pnpm-commons/index.ts new file mode 100644 index 0000000..8bd4f18 --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/index.ts @@ -0,0 +1,10 @@ +export { runAudit } from './audit'; +export { runDeprecate } from './deprecate'; +export { runInstall } from './install'; +export { runInfo } from './info'; +export { runPing } from './ping'; +export { runPublish } from './publish'; +export { runSearch } from './search'; +export { runStar } from './star'; +export { runUnpublish } from './unpublish'; +export { runDistTag } from './dist-tags'; diff --git a/e2e/cli/e2e-pnpm-commons/info.ts b/e2e/cli/e2e-pnpm-commons/info.ts new file mode 100644 index 0000000..e9bf344 --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/info.ts @@ -0,0 +1,32 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; + +export function runInfo(pnpm) { + describe('info a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test('should run pnpm info json body', async () => { + const resp = await pnpm( + {}, + 'info', + 'verdaccio', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + const parsedBody = JSON.parse(resp.stdout as string); + expect(parsedBody.name).toEqual('verdaccio'); + expect(parsedBody.dependencies).toBeDefined(); + }); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-pnpm-commons/install.ts b/e2e/cli/e2e-pnpm-commons/install.ts new file mode 100644 index 0000000..1dacfe0 --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/install.ts @@ -0,0 +1,37 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; + +export function runInstall(pnpm) { + describe('install a project packages', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test('should run npm install json body', async () => { + const { tempFolder } = await prepareGenericEmptyProject( + 'something', + '1.0.0-patch', + registry.port, + registry.getToken(), + registry.getRegistryUrl(), + { react: '18.2.0' } + ); + const resp = await pnpm( + { cwd: tempFolder }, + 'install', + '--reporter=default', + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp.stdout).toMatch(/react/); + }); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-pnpm-commons/package.json b/e2e/cli/e2e-pnpm-commons/package.json new file mode 100644 index 0000000..f3a4e97 --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/package.json @@ -0,0 +1,10 @@ +{ + "private": true, + "name": "@verdaccio/e2e-cli-pnpm-common", + "version": "1.0.2-next-8.0", + "dependencies": { + "@verdaccio/test-cli-commons": "workspace:*", + "pnpm": "9.15.4" + }, + "main": "index.ts" +} diff --git a/e2e/cli/e2e-pnpm-commons/ping.ts b/e2e/cli/e2e-pnpm-commons/ping.ts new file mode 100644 index 0000000..a628f0b --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/ping.ts @@ -0,0 +1,25 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; + +export function runPing(pnpm) { + describe('ping registry', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test('should ping registry', async () => { + const resp = await pnpm({}, 'ping', '--json', ...addRegistry(registry.getRegistryUrl())); + const parsedBody = JSON.parse(resp.stdout as string); + expect(parsedBody.registry).toEqual(registry.getRegistryUrl() + '/'); + }); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-pnpm-commons/publish.ts b/e2e/cli/e2e-pnpm-commons/publish.ts new file mode 100644 index 0000000..e33fd7f --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/publish.ts @@ -0,0 +1,42 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; + +export function runPublish(pnpm) { + describe('publish a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test.each([['verdaccio-memory', 'verdaccio', '@verdaccio/foo', '@verdaccio/some-foo']])( + 'should publish a package %s', + async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-patch', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + const resp = await pnpm( + { cwd: tempFolder }, + 'publish', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + const parsedBody = JSON.parse(resp.stdout as string); + expect(parsedBody.name).toEqual(pkgName); + expect(parsedBody.files).toBeDefined(); + expect(parsedBody.files).toBeDefined(); + } + ); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-pnpm-commons/search.ts b/e2e/cli/e2e-pnpm-commons/search.ts new file mode 100644 index 0000000..64079ed --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/search.ts @@ -0,0 +1,34 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; + +export function runSearch(pnpm) { + describe('search a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test('should search a package', async () => { + const resp = await pnpm( + {}, + 'search', + '@verdaccio/cli', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + const parsedBody = JSON.parse(resp.stdout as string); + const pkgFind = parsedBody.find((item) => { + return item.name === '@verdaccio/cli'; + }); + expect(pkgFind.name).toEqual('@verdaccio/cli'); + }); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-pnpm-commons/star.ts b/e2e/cli/e2e-pnpm-commons/star.ts new file mode 100644 index 0000000..bc984b9 --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/star.ts @@ -0,0 +1,90 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { + addRegistry, + initialSetup, + pnpmUtils, + prepareGenericEmptyProject, +} from '@verdaccio/test-cli-commons'; + +export function runStar(pnpm) { + describe('star a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test.each([['@verdaccio/foo']])('should star a package %s', async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-patch', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + const resp = await pnpm( + { cwd: tempFolder }, + 'star', + pkgName, + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp.stdout).toEqual(`★ ${pkgName}`); + }); + + test.each([['@verdaccio/bar']])('should unstar a package %s', async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-patch', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + const resp = await pnpm( + { cwd: tempFolder }, + 'star', + pkgName, + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp.stdout).toEqual(`★ ${pkgName}`); + + const resp1 = await pnpm( + { cwd: tempFolder }, + 'unstar', + pkgName, + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp1.stdout).toEqual(`☆ ${pkgName}`); + }); + + test('should list stars of a user %s', async () => { + const pkgName = '@verdaccio/stars'; + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-patch', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); + await pnpm({ cwd: tempFolder }, 'star', pkgName, ...addRegistry(registry.getRegistryUrl())); + const resp = await pnpm( + { cwd: tempFolder }, + 'stars', + ...addRegistry(registry.getRegistryUrl()) + ); + // side effects: this result is affected the the package published in the previous step + expect(resp.stdout).toEqual(`@verdaccio/foo@verdaccio/stars`); + }); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-pnpm-commons/tsconfig.json b/e2e/cli/e2e-pnpm-commons/tsconfig.json new file mode 100644 index 0000000..a5e8431 --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../../tsconfig.reference.json" +} diff --git a/e2e/cli/e2e-pnpm-commons/unpublish.ts b/e2e/cli/e2e-pnpm-commons/unpublish.ts new file mode 100644 index 0000000..fd433d1 --- /dev/null +++ b/e2e/cli/e2e-pnpm-commons/unpublish.ts @@ -0,0 +1,86 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { + addRegistry, + initialSetup, + npmUtils, + prepareGenericEmptyProject, +} from '@verdaccio/test-cli-commons'; + +export function runUnpublish(pnpm) { + describe('unpublish a package', () => { + let registry; + + beforeAll(async () => { + const setup = await initialSetup(); + registry = setup.registry; + await registry.init(); + }); + + test.each([['@verdaccio/test1', 'super-package-do-not-exist-spam']])( + 'should unpublish a full package %s', + async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-beta', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await npmUtils.publish(pnpm, tempFolder, pkgName, registry); + await npmUtils.bumpUpPackage(pnpm, tempFolder, pkgName, registry, ['minor']); + await npmUtils.publish(pnpm, tempFolder, pkgName, registry); + await npmUtils.bumpUpPackage(pnpm, tempFolder, pkgName, registry, ['minor']); + await npmUtils.publish(pnpm, tempFolder, pkgName, registry); + await npmUtils.bumpUpPackage(pnpm, tempFolder, pkgName, registry, ['major']); + await npmUtils.publish(pnpm, tempFolder, pkgName, registry); + + const resp2 = await pnpm( + { cwd: tempFolder }, + 'unpublish', + pkgName, + '--force', + '--loglevel=info', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp2.stdout).toEqual('- @verdaccio/test1'); + } + ); + + test.each([['@verdaccio/test1', 'super-package-do-not-exist-spam']])( + 'should unpublish a package %s version', + async (pkgName) => { + const { tempFolder } = await prepareGenericEmptyProject( + pkgName, + '1.0.0-beta', + registry.port, + registry.getToken(), + registry.getRegistryUrl() + ); + await npmUtils.publish(pnpm, tempFolder, pkgName, registry); + await npmUtils.bumpUpPackage(pnpm, tempFolder, pkgName, registry, ['minor']); + await npmUtils.publish(pnpm, tempFolder, pkgName, registry); + await npmUtils.bumpUpPackage(pnpm, tempFolder, pkgName, registry, ['minor']); + await npmUtils.publish(pnpm, tempFolder, pkgName, registry); + await npmUtils.bumpUpPackage(pnpm, tempFolder, pkgName, registry, ['major']); + await npmUtils.publish(pnpm, tempFolder, pkgName, registry); + + const resp2 = await pnpm( + { cwd: tempFolder }, + 'unpublish', + `${pkgName}@1.0.0-beta`, + '--force', + '--loglevel=info', + '--json', + ...addRegistry(registry.getRegistryUrl()) + ); + expect(resp2.stdout).toEqual('- @verdaccio/test1@1.0.0-beta'); + } + ); + + afterAll(async () => { + registry.stop(); + }); + }); +} diff --git a/e2e/cli/e2e-pnpm10/.babelrc b/e2e/cli/e2e-pnpm10/.babelrc new file mode 100644 index 0000000..851856e --- /dev/null +++ b/e2e/cli/e2e-pnpm10/.babelrc @@ -0,0 +1,3 @@ +{ + "extends": "../../../.babelrc" +} diff --git a/e2e/cli/e2e-pnpm10/.eslintrc b/e2e/cli/e2e-pnpm10/.eslintrc new file mode 100644 index 0000000..eb2ac4c --- /dev/null +++ b/e2e/cli/e2e-pnpm10/.eslintrc @@ -0,0 +1,7 @@ +{ + "rules": { + "no-console": 0, + "@typescript-eslint/no-var-requires": 0, + "@typescript-eslint/explicit-member-accessibility": 0 + } +} diff --git a/e2e/cli/e2e-pnpm10/CHANGELOG.md b/e2e/cli/e2e-pnpm10/CHANGELOG.md new file mode 100644 index 0000000..4ac7ce3 --- /dev/null +++ b/e2e/cli/e2e-pnpm10/CHANGELOG.md @@ -0,0 +1,8 @@ +# @verdaccio/e2e-cli-pnpm9 + +## 1.0.2-next-8.0 + +### Patch Changes + +- Updated dependencies + - @verdaccio/test-cli-commons@2.0.0-next-8.0 diff --git a/e2e/cli/e2e-pnpm10/audit.spec.ts b/e2e/cli/e2e-pnpm10/audit.spec.ts new file mode 100644 index 0000000..2b748b9 --- /dev/null +++ b/e2e/cli/e2e-pnpm10/audit.spec.ts @@ -0,0 +1,9 @@ +import { describe } from 'vitest'; + +import { runAudit } from '@verdaccio/e2e-cli-pnpm-common'; + +import { pnpm } from './utils'; + +describe('audit a package', () => { + runAudit(pnpm); +}); diff --git a/e2e/cli/e2e-pnpm10/deprecate.spec.ts b/e2e/cli/e2e-pnpm10/deprecate.spec.ts new file mode 100644 index 0000000..2d3f152 --- /dev/null +++ b/e2e/cli/e2e-pnpm10/deprecate.spec.ts @@ -0,0 +1,9 @@ +import { describe } from 'vitest'; + +import { runDeprecate } from '@verdaccio/e2e-cli-pnpm-common'; + +import { pnpm } from './utils'; + +describe('deprecate a package', () => { + runDeprecate(pnpm); +}); diff --git a/e2e/cli/e2e-pnpm10/dist-tags.spec.ts b/e2e/cli/e2e-pnpm10/dist-tags.spec.ts new file mode 100644 index 0000000..a1fadc2 --- /dev/null +++ b/e2e/cli/e2e-pnpm10/dist-tags.spec.ts @@ -0,0 +1,9 @@ +import { describe } from 'vitest'; + +import { runDistTag } from '@verdaccio/e2e-cli-pnpm-common'; + +import { pnpm } from './utils'; + +describe('dist-tags a package', () => { + runDistTag(pnpm); +}); diff --git a/e2e/cli/e2e-pnpm10/info.spec.ts b/e2e/cli/e2e-pnpm10/info.spec.ts new file mode 100644 index 0000000..e60ae17 --- /dev/null +++ b/e2e/cli/e2e-pnpm10/info.spec.ts @@ -0,0 +1,9 @@ +import { describe } from 'vitest'; + +import { runInfo } from '@verdaccio/e2e-cli-pnpm-common'; + +import { pnpm } from './utils'; + +describe('info a package', () => { + runInfo(pnpm); +}); diff --git a/e2e/cli/e2e-pnpm10/install.spec.ts b/e2e/cli/e2e-pnpm10/install.spec.ts new file mode 100644 index 0000000..7cd30d1 --- /dev/null +++ b/e2e/cli/e2e-pnpm10/install.spec.ts @@ -0,0 +1,9 @@ +import { describe } from 'vitest'; + +import { runInstall } from '@verdaccio/e2e-cli-pnpm-common'; + +import { pnpm } from './utils'; + +describe('install a project packages', () => { + runInstall(pnpm); +}); diff --git a/e2e/cli/e2e-pnpm10/package.json b/e2e/cli/e2e-pnpm10/package.json new file mode 100644 index 0000000..06b3f13 --- /dev/null +++ b/e2e/cli/e2e-pnpm10/package.json @@ -0,0 +1,13 @@ +{ + "private": true, + "name": "@verdaccio/e2e-cli-pnpm10", + "version": "1.0.0", + "dependencies": { + "@verdaccio/test-cli-commons": "workspace:*", + "@verdaccio/e2e-cli-pnpm-common": "workspace:*", + "pnpm": "10.0.0-alpha.2" + }, + "scripts": { + "test": "vitest run --testTimeout 50000" + } +} diff --git a/e2e/cli/e2e-pnpm10/ping.spec.ts b/e2e/cli/e2e-pnpm10/ping.spec.ts new file mode 100644 index 0000000..0a9b8b6 --- /dev/null +++ b/e2e/cli/e2e-pnpm10/ping.spec.ts @@ -0,0 +1,9 @@ +import { describe } from 'vitest'; + +import { runPing } from '@verdaccio/e2e-cli-pnpm-common'; + +import { pnpm } from './utils'; + +describe('ping registry', () => { + runPing(pnpm); +}); diff --git a/e2e/cli/e2e-pnpm10/publish.spec.ts b/e2e/cli/e2e-pnpm10/publish.spec.ts new file mode 100644 index 0000000..bbf2b52 --- /dev/null +++ b/e2e/cli/e2e-pnpm10/publish.spec.ts @@ -0,0 +1,9 @@ +import { describe } from 'vitest'; + +import { runPublish } from '@verdaccio/e2e-cli-pnpm-common'; + +import { pnpm } from './utils'; + +describe('publish a package', () => { + runPublish(pnpm); +}); diff --git a/e2e/cli/e2e-pnpm10/search.spec.ts b/e2e/cli/e2e-pnpm10/search.spec.ts new file mode 100644 index 0000000..dee4962 --- /dev/null +++ b/e2e/cli/e2e-pnpm10/search.spec.ts @@ -0,0 +1,9 @@ +import { describe } from 'vitest'; + +import { runSearch } from '@verdaccio/e2e-cli-pnpm-common'; + +import { pnpm } from './utils'; + +describe('search a package', () => { + runSearch(pnpm); +}); diff --git a/e2e/cli/e2e-pnpm10/star.spec.ts b/e2e/cli/e2e-pnpm10/star.spec.ts new file mode 100644 index 0000000..f21a53b --- /dev/null +++ b/e2e/cli/e2e-pnpm10/star.spec.ts @@ -0,0 +1,9 @@ +import { describe } from 'vitest'; + +import { runStar } from '@verdaccio/e2e-cli-pnpm-common'; + +import { pnpm } from './utils'; + +describe('star a package', () => { + runStar(pnpm); +}); diff --git a/e2e/cli/e2e-pnpm10/tsconfig.json b/e2e/cli/e2e-pnpm10/tsconfig.json new file mode 100644 index 0000000..a5e8431 --- /dev/null +++ b/e2e/cli/e2e-pnpm10/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../../tsconfig.reference.json" +} diff --git a/e2e/cli/e2e-pnpm10/unpublish.spec.ts b/e2e/cli/e2e-pnpm10/unpublish.spec.ts new file mode 100644 index 0000000..c71e2d2 --- /dev/null +++ b/e2e/cli/e2e-pnpm10/unpublish.spec.ts @@ -0,0 +1,9 @@ +import { describe } from 'vitest'; + +import { runUnpublish } from '@verdaccio/e2e-cli-pnpm-common'; + +import { pnpm } from './utils'; + +describe('unpublish a package', () => { + runUnpublish(pnpm); +}); diff --git a/e2e/cli/e2e-pnpm7/utils.ts b/e2e/cli/e2e-pnpm10/utils.ts similarity index 100% rename from e2e/cli/e2e-pnpm7/utils.ts rename to e2e/cli/e2e-pnpm10/utils.ts diff --git a/e2e/cli/e2e-pnpm7/CHANGELOG.md b/e2e/cli/e2e-pnpm7/CHANGELOG.md deleted file mode 100644 index 1e6b2fe..0000000 --- a/e2e/cli/e2e-pnpm7/CHANGELOG.md +++ /dev/null @@ -1,39 +0,0 @@ -# @verdaccio/e2e-cli-pnpm7 - -## 1.0.1-6-next.5 - -### Patch Changes - -- @verdaccio/test-cli-commons@1.0.1-6-next.5 - -## 1.0.1-6-next.4 - -### Patch Changes - -- @verdaccio/test-cli-commons@1.0.1-6-next.4 - -## 1.0.1-6-next.3 - -### Patch Changes - -- 351aeeaa: fix(deps): @verdaccio/utils should be a prod dep of local-storage -- Updated dependencies [351aeeaa] - - @verdaccio/test-cli-commons@1.0.1-6-next.3 - -## 1.0.1-6-next.2 - -### Patch Changes - -- @verdaccio/test-cli-commons@1.0.1-6-next.2 - -## 1.0.1-6-next.1 - -### Patch Changes - -- @verdaccio/test-cli-commons@1.0.1-6-next.1 - -## 1.0.1-6-next.0 - -### Patch Changes - -- @verdaccio/test-cli-commons@1.0.1-6-next.0 diff --git a/e2e/cli/e2e-pnpm7/audit.spec.ts b/e2e/cli/e2e-pnpm7/audit.spec.ts deleted file mode 100644 index 72c1284..0000000 --- a/e2e/cli/e2e-pnpm7/audit.spec.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; - -import { pnpm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', '@verdaccio/cli']])( - 'should audit a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { jquery: '3.6.1' } - ); - // install is required to create package lock file - await pnpm({ cwd: tempFolder }, 'install', ...addRegistry(registry.getRegistryUrl())); - const resp = await pnpm( - { cwd: tempFolder }, - 'audit', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.metadata).toBeDefined(); - expect(parsedBody.actions).toBeDefined(); - expect(parsedBody.advisories).toBeDefined(); - expect(parsedBody.muted).toBeDefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-pnpm7/deprecate.spec.ts b/e2e/cli/e2e-pnpm7/deprecate.spec.ts deleted file mode 100644 index 2e7ae0a..0000000 --- a/e2e/cli/e2e-pnpm7/deprecate.spec.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { - addRegistry, - initialSetup, - pnpmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; - -import { pnpm } from './utils'; - -describe('deprecate a package', () => { - jest.setTimeout(20000); - let registry; - - async function deprecate(tempFolder, packageVersion, registry, message) { - await pnpm( - { cwd: tempFolder }, - 'deprecate', - packageVersion, - message, - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - } - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/deprecated-1']])( - 'should deprecate a single package %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}`, registry); - expect(infoBody.name).toEqual(pkgName); - expect(infoBody.deprecated).toEqual(message); - } - ); - - test.each([['@verdaccio/deprecated-2']])('should un-deprecate a package %s', async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}`, registry); - expect(infoBody.deprecated).toEqual(message); - // empty string is same as undeprecate - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, ''); - const infoBody2 = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}`, registry); - expect(infoBody2.deprecated).toBeUndefined(); - }); - - test.each([['@verdaccio/deprecated-3']])( - 'should deprecate a multiple packages %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - // publish 1.0.0 - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // publish 1.1.0 - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // publish 1.2.0 - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // publish 1.3.0 - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // // deprecate all version - await deprecate(tempFolder, pkgName, registry, message); - // verify is deprecated - for (let v of ['1.0.0', '1.1.0', '1.2.0', '1.3.0']) { - const infoResp = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}@${v}`, registry); - expect(infoResp.deprecated).toEqual(message); - } - // publish normal version - // publish 1.4.0 - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - const infoResp = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}@1.4.0`, registry); - // must be not deprecated - expect(infoResp.deprecated).toBeUndefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-pnpm7/dist-tags.spec.ts b/e2e/cli/e2e-pnpm7/dist-tags.spec.ts deleted file mode 100644 index da9e7d9..0000000 --- a/e2e/cli/e2e-pnpm7/dist-tags.spec.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { - addRegistry, - initialSetup, - pnpmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; - -import { pnpm } from './utils'; - -describe('publish a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@foo/foo', 'foo']])('should list dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await pnpm( - { cwd: tempFolder }, - 'dist-tag', - 'ls', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('beta: 1.1.0latest: 1.0.0'); - }); - - test.each([['@verdaccio/bar']])('should remove tag with dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await pnpm( - { cwd: tempFolder }, - 'dist-tag', - 'rm', - `${pkgName}@1.1.0`, - 'beta', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('-beta: @verdaccio/bar@1.1.0'); - }); - - test.each([['@verdaccio/five']])( - 'should add tag to package and version with dist-tags for %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - const resp2 = await pnpm( - { cwd: tempFolder }, - 'dist-tag', - 'add', - `${pkgName}@1.1.0`, - 'alfa', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual(`+alfa: ${pkgName}@1.1.0`); - } - ); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-pnpm7/info.spec.ts b/e2e/cli/e2e-pnpm7/info.spec.ts deleted file mode 100644 index 2c49c21..0000000 --- a/e2e/cli/e2e-pnpm7/info.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; - -import { pnpm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run pnpm info json body', async () => { - const resp = await pnpm( - {}, - 'info', - 'verdaccio', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual('verdaccio'); - expect(parsedBody.dependencies).toBeDefined(); - }); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-pnpm7/install.spec.ts b/e2e/cli/e2e-pnpm7/install.spec.ts deleted file mode 100644 index 77440d9..0000000 --- a/e2e/cli/e2e-pnpm7/install.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; - -import { pnpm } from './utils'; - -describe('install a project packages', () => { - jest.setTimeout(80000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run npm install json body', async () => { - const { tempFolder } = await prepareGenericEmptyProject( - 'something', - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { react: '18.2.0' } - ); - const resp = await pnpm( - { cwd: tempFolder }, - 'install', - '--reporter=default', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toMatch(/react/); - }); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-pnpm7/jest.config.js b/e2e/cli/e2e-pnpm7/jest.config.js deleted file mode 100644 index cd97591..0000000 --- a/e2e/cli/e2e-pnpm7/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../jest.config'); - -module.exports = { ...config }; diff --git a/e2e/cli/e2e-pnpm7/package.json b/e2e/cli/e2e-pnpm7/package.json deleted file mode 100644 index efc385d..0000000 --- a/e2e/cli/e2e-pnpm7/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "private": true, - "name": "@verdaccio/e2e-cli-pnpm7", - "version": "1.0.1-6-next.5", - "dependencies": { - "@verdaccio/test-cli-commons": "workspace:1.0.1-6-next.5", - "pnpm": "next-7" - }, - "scripts": { - "test": "jest" - } -} diff --git a/e2e/cli/e2e-pnpm7/ping.spec.ts b/e2e/cli/e2e-pnpm7/ping.spec.ts deleted file mode 100644 index f8ae245..0000000 --- a/e2e/cli/e2e-pnpm7/ping.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; - -import { pnpm } from './utils'; - -describe('ping registry', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should ping registry', async () => { - const resp = await pnpm({}, 'ping', '--json', ...addRegistry(registry.getRegistryUrl())); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.registry).toEqual(registry.getRegistryUrl() + '/'); - }); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-pnpm7/publish.spec.ts b/e2e/cli/e2e-pnpm7/publish.spec.ts deleted file mode 100644 index 4a2a629..0000000 --- a/e2e/cli/e2e-pnpm7/publish.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; - -import { pnpm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', 'verdaccio', '@verdaccio/foo', '@verdaccio/some-foo']])( - 'should publish a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - const resp = await pnpm( - { cwd: tempFolder }, - 'publish', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); - expect(parsedBody.files).toBeDefined(); - expect(parsedBody.files).toBeDefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-pnpm7/search.spec.ts b/e2e/cli/e2e-pnpm7/search.spec.ts deleted file mode 100644 index ec06178..0000000 --- a/e2e/cli/e2e-pnpm7/search.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; - -import { pnpm } from './utils'; - -describe('search a package', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should search a package', async () => { - const resp = await pnpm( - {}, - 'search', - '@verdaccio/cli', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - const pkgFind = parsedBody.find((item) => { - return item.name === '@verdaccio/cli'; - }); - expect(pkgFind.name).toEqual('@verdaccio/cli'); - }); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-pnpm7/star.spec.ts b/e2e/cli/e2e-pnpm7/star.spec.ts deleted file mode 100644 index d0b906f..0000000 --- a/e2e/cli/e2e-pnpm7/star.spec.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { - addRegistry, - initialSetup, - pnpmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; - -import { pnpm } from './utils'; - -describe('star a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/foo']])('should star a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - const resp = await pnpm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - }); - - test.each([['@verdaccio/bar']])('should unstar a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - const resp = await pnpm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - - const resp1 = await pnpm( - { cwd: tempFolder }, - 'unstar', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp1.stdout).toEqual(`☆ ${pkgName}`); - }); - - test('should list stars of a user %s', async () => { - const pkgName = '@verdaccio/stars'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - await pnpm({ cwd: tempFolder }, 'star', pkgName, ...addRegistry(registry.getRegistryUrl())); - const resp = await pnpm( - { cwd: tempFolder }, - 'stars', - ...addRegistry(registry.getRegistryUrl()) - ); - // side effects: this result is affected the the package published in the previous step - expect(resp.stdout).toEqual(`@verdaccio/foo@verdaccio/stars`); - }); - - afterAll(async () => { - registry.stop(); - }); -}); diff --git a/e2e/cli/e2e-pnpm7/tsconfig.json b/e2e/cli/e2e-pnpm7/tsconfig.json deleted file mode 100644 index 85f4cec..0000000 --- a/e2e/cli/e2e-pnpm7/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../../../tsconfig.reference.json", - "references": [ - { - "path": "../cli-commons" - } - ] -} diff --git a/e2e/cli/e2e-pnpm8/CHANGELOG.md b/e2e/cli/e2e-pnpm8/CHANGELOG.md index 1e6b2fe..215ad45 100644 --- a/e2e/cli/e2e-pnpm8/CHANGELOG.md +++ b/e2e/cli/e2e-pnpm8/CHANGELOG.md @@ -1,5 +1,35 @@ # @verdaccio/e2e-cli-pnpm7 +## 1.0.2-next-8.0 + +### Patch Changes + +- Updated dependencies + - @verdaccio/test-cli-commons@2.0.0-next-8.0 + +## 1.0.1 + +### Patch Changes + +- Updated dependencies [351aeeaa8] +- Updated dependencies [d167f92e1] +- Updated dependencies [c383eb68c] + - @verdaccio/test-cli-commons@1.1.0 + +## 1.0.1-6-next.7 + +### Patch Changes + +- Updated dependencies [c383eb68] + - @verdaccio/test-cli-commons@1.1.0-6-next.7 + +## 1.0.1-6-next.6 + +### Patch Changes + +- Updated dependencies [d167f92e] + - @verdaccio/test-cli-commons@1.1.0-6-next.6 + ## 1.0.1-6-next.5 ### Patch Changes diff --git a/e2e/cli/e2e-pnpm8/audit.spec.ts b/e2e/cli/e2e-pnpm8/audit.spec.ts index 72c1284..2b748b9 100644 --- a/e2e/cli/e2e-pnpm8/audit.spec.ts +++ b/e2e/cli/e2e-pnpm8/audit.spec.ts @@ -1,45 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { pnpm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; +import { runAudit } from '@verdaccio/e2e-cli-pnpm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', '@verdaccio/cli']])( - 'should audit a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { jquery: '3.6.1' } - ); - // install is required to create package lock file - await pnpm({ cwd: tempFolder }, 'install', ...addRegistry(registry.getRegistryUrl())); - const resp = await pnpm( - { cwd: tempFolder }, - 'audit', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.metadata).toBeDefined(); - expect(parsedBody.actions).toBeDefined(); - expect(parsedBody.advisories).toBeDefined(); - expect(parsedBody.muted).toBeDefined(); - } - ); +import { pnpm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('audit a package', () => { + runAudit(pnpm); }); diff --git a/e2e/cli/e2e-pnpm8/deprecate.spec.ts b/e2e/cli/e2e-pnpm8/deprecate.spec.ts index 2e7ae0a..2d3f152 100644 --- a/e2e/cli/e2e-pnpm8/deprecate.spec.ts +++ b/e2e/cli/e2e-pnpm8/deprecate.spec.ts @@ -1,115 +1,9 @@ -import { - addRegistry, - initialSetup, - pnpmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runDeprecate } from '@verdaccio/e2e-cli-pnpm-common'; import { pnpm } from './utils'; describe('deprecate a package', () => { - jest.setTimeout(20000); - let registry; - - async function deprecate(tempFolder, packageVersion, registry, message) { - await pnpm( - { cwd: tempFolder }, - 'deprecate', - packageVersion, - message, - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - } - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/deprecated-1']])( - 'should deprecate a single package %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}`, registry); - expect(infoBody.name).toEqual(pkgName); - expect(infoBody.deprecated).toEqual(message); - } - ); - - test.each([['@verdaccio/deprecated-2']])('should un-deprecate a package %s', async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}`, registry); - expect(infoBody.deprecated).toEqual(message); - // empty string is same as undeprecate - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, ''); - const infoBody2 = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}`, registry); - expect(infoBody2.deprecated).toBeUndefined(); - }); - - test.each([['@verdaccio/deprecated-3']])( - 'should deprecate a multiple packages %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - // publish 1.0.0 - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // publish 1.1.0 - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // publish 1.2.0 - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // publish 1.3.0 - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // // deprecate all version - await deprecate(tempFolder, pkgName, registry, message); - // verify is deprecated - for (let v of ['1.0.0', '1.1.0', '1.2.0', '1.3.0']) { - const infoResp = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}@${v}`, registry); - expect(infoResp.deprecated).toEqual(message); - } - // publish normal version - // publish 1.4.0 - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - const infoResp = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}@1.4.0`, registry); - // must be not deprecated - expect(infoResp.deprecated).toBeUndefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runDeprecate(pnpm); }); diff --git a/e2e/cli/e2e-pnpm8/dist-tags.spec.ts b/e2e/cli/e2e-pnpm8/dist-tags.spec.ts index da9e7d9..a1fadc2 100644 --- a/e2e/cli/e2e-pnpm8/dist-tags.spec.ts +++ b/e2e/cli/e2e-pnpm8/dist-tags.spec.ts @@ -1,91 +1,9 @@ -import { - addRegistry, - initialSetup, - pnpmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { pnpm } from './utils'; - -describe('publish a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); +import { runDistTag } from '@verdaccio/e2e-cli-pnpm-common'; - test.each([['@foo/foo', 'foo']])('should list dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await pnpm( - { cwd: tempFolder }, - 'dist-tag', - 'ls', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('beta: 1.1.0latest: 1.0.0'); - }); - - test.each([['@verdaccio/bar']])('should remove tag with dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await pnpm( - { cwd: tempFolder }, - 'dist-tag', - 'rm', - `${pkgName}@1.1.0`, - 'beta', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('-beta: @verdaccio/bar@1.1.0'); - }); - - test.each([['@verdaccio/five']])( - 'should add tag to package and version with dist-tags for %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - const resp2 = await pnpm( - { cwd: tempFolder }, - 'dist-tag', - 'add', - `${pkgName}@1.1.0`, - 'alfa', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual(`+alfa: ${pkgName}@1.1.0`); - } - ); +import { pnpm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('dist-tags a package', () => { + runDistTag(pnpm); }); diff --git a/e2e/cli/e2e-pnpm8/info.spec.ts b/e2e/cli/e2e-pnpm8/info.spec.ts index 2c49c21..e60ae17 100644 --- a/e2e/cli/e2e-pnpm8/info.spec.ts +++ b/e2e/cli/e2e-pnpm8/info.spec.ts @@ -1,31 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { pnpm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; +import { runInfo } from '@verdaccio/e2e-cli-pnpm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run pnpm info json body', async () => { - const resp = await pnpm( - {}, - 'info', - 'verdaccio', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual('verdaccio'); - expect(parsedBody.dependencies).toBeDefined(); - }); +import { pnpm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('info a package', () => { + runInfo(pnpm); }); diff --git a/e2e/cli/e2e-pnpm8/install.spec.ts b/e2e/cli/e2e-pnpm8/install.spec.ts index 77440d9..7cd30d1 100644 --- a/e2e/cli/e2e-pnpm8/install.spec.ts +++ b/e2e/cli/e2e-pnpm8/install.spec.ts @@ -1,36 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runInstall } from '@verdaccio/e2e-cli-pnpm-common'; import { pnpm } from './utils'; describe('install a project packages', () => { - jest.setTimeout(80000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run npm install json body', async () => { - const { tempFolder } = await prepareGenericEmptyProject( - 'something', - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { react: '18.2.0' } - ); - const resp = await pnpm( - { cwd: tempFolder }, - 'install', - '--reporter=default', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toMatch(/react/); - }); - - afterAll(async () => { - registry.stop(); - }); + runInstall(pnpm); }); diff --git a/e2e/cli/e2e-pnpm8/jest.config.js b/e2e/cli/e2e-pnpm8/jest.config.js deleted file mode 100644 index cd97591..0000000 --- a/e2e/cli/e2e-pnpm8/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../jest.config'); - -module.exports = { ...config }; diff --git a/e2e/cli/e2e-pnpm8/package.json b/e2e/cli/e2e-pnpm8/package.json index 39275d0..4d8b84c 100644 --- a/e2e/cli/e2e-pnpm8/package.json +++ b/e2e/cli/e2e-pnpm8/package.json @@ -1,12 +1,13 @@ { "private": true, "name": "@verdaccio/e2e-cli-pnpm8", - "version": "1.0.1-6-next.5", + "version": "1.0.2-next-8.0", "dependencies": { - "@verdaccio/test-cli-commons": "workspace:1.0.1-6-next.5", - "pnpm": "next-8" + "@verdaccio/test-cli-commons": "workspace:*", + "@verdaccio/e2e-cli-pnpm-common": "workspace:*", + "pnpm": "8.15.9" }, "scripts": { - "test": "jest" + "test": "vitest run --testTimeout 50000" } } diff --git a/e2e/cli/e2e-pnpm8/ping.spec.ts b/e2e/cli/e2e-pnpm8/ping.spec.ts index f8ae245..0a9b8b6 100644 --- a/e2e/cli/e2e-pnpm8/ping.spec.ts +++ b/e2e/cli/e2e-pnpm8/ping.spec.ts @@ -1,24 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runPing } from '@verdaccio/e2e-cli-pnpm-common'; import { pnpm } from './utils'; describe('ping registry', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should ping registry', async () => { - const resp = await pnpm({}, 'ping', '--json', ...addRegistry(registry.getRegistryUrl())); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.registry).toEqual(registry.getRegistryUrl() + '/'); - }); - - afterAll(async () => { - registry.stop(); - }); + runPing(pnpm); }); diff --git a/e2e/cli/e2e-pnpm8/publish.spec.ts b/e2e/cli/e2e-pnpm8/publish.spec.ts index 4a2a629..bbf2b52 100644 --- a/e2e/cli/e2e-pnpm8/publish.spec.ts +++ b/e2e/cli/e2e-pnpm8/publish.spec.ts @@ -1,41 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { pnpm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; +import { runPublish } from '@verdaccio/e2e-cli-pnpm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', 'verdaccio', '@verdaccio/foo', '@verdaccio/some-foo']])( - 'should publish a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - const resp = await pnpm( - { cwd: tempFolder }, - 'publish', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); - expect(parsedBody.files).toBeDefined(); - expect(parsedBody.files).toBeDefined(); - } - ); +import { pnpm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('publish a package', () => { + runPublish(pnpm); }); diff --git a/e2e/cli/e2e-pnpm8/search.spec.ts b/e2e/cli/e2e-pnpm8/search.spec.ts index ec06178..dee4962 100644 --- a/e2e/cli/e2e-pnpm8/search.spec.ts +++ b/e2e/cli/e2e-pnpm8/search.spec.ts @@ -1,33 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runSearch } from '@verdaccio/e2e-cli-pnpm-common'; import { pnpm } from './utils'; describe('search a package', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should search a package', async () => { - const resp = await pnpm( - {}, - 'search', - '@verdaccio/cli', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - const pkgFind = parsedBody.find((item) => { - return item.name === '@verdaccio/cli'; - }); - expect(pkgFind.name).toEqual('@verdaccio/cli'); - }); - - afterAll(async () => { - registry.stop(); - }); + runSearch(pnpm); }); diff --git a/e2e/cli/e2e-pnpm8/star.spec.ts b/e2e/cli/e2e-pnpm8/star.spec.ts index d0b906f..f21a53b 100644 --- a/e2e/cli/e2e-pnpm8/star.spec.ts +++ b/e2e/cli/e2e-pnpm8/star.spec.ts @@ -1,89 +1,9 @@ -import { - addRegistry, - initialSetup, - pnpmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runStar } from '@verdaccio/e2e-cli-pnpm-common'; import { pnpm } from './utils'; describe('star a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/foo']])('should star a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - const resp = await pnpm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - }); - - test.each([['@verdaccio/bar']])('should unstar a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - const resp = await pnpm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - - const resp1 = await pnpm( - { cwd: tempFolder }, - 'unstar', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp1.stdout).toEqual(`☆ ${pkgName}`); - }); - - test('should list stars of a user %s', async () => { - const pkgName = '@verdaccio/stars'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - await pnpm({ cwd: tempFolder }, 'star', pkgName, ...addRegistry(registry.getRegistryUrl())); - const resp = await pnpm( - { cwd: tempFolder }, - 'stars', - ...addRegistry(registry.getRegistryUrl()) - ); - // side effects: this result is affected the the package published in the previous step - expect(resp.stdout).toEqual(`@verdaccio/foo@verdaccio/stars`); - }); - - afterAll(async () => { - registry.stop(); - }); + runStar(pnpm); }); diff --git a/e2e/cli/e2e-pnpm8/tsconfig.json b/e2e/cli/e2e-pnpm8/tsconfig.json index 85f4cec..a5e8431 100644 --- a/e2e/cli/e2e-pnpm8/tsconfig.json +++ b/e2e/cli/e2e-pnpm8/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "../../../tsconfig.reference.json", - "references": [ - { - "path": "../cli-commons" - } - ] + "extends": "../../../tsconfig.reference.json" } diff --git a/e2e/cli/e2e-pnpm8/unpublish.spec.ts b/e2e/cli/e2e-pnpm8/unpublish.spec.ts new file mode 100644 index 0000000..c71e2d2 --- /dev/null +++ b/e2e/cli/e2e-pnpm8/unpublish.spec.ts @@ -0,0 +1,9 @@ +import { describe } from 'vitest'; + +import { runUnpublish } from '@verdaccio/e2e-cli-pnpm-common'; + +import { pnpm } from './utils'; + +describe('unpublish a package', () => { + runUnpublish(pnpm); +}); diff --git a/e2e/cli/e2e-pnpm9/CHANGELOG.md b/e2e/cli/e2e-pnpm9/CHANGELOG.md index 1e6b2fe..4ac7ce3 100644 --- a/e2e/cli/e2e-pnpm9/CHANGELOG.md +++ b/e2e/cli/e2e-pnpm9/CHANGELOG.md @@ -1,39 +1,8 @@ -# @verdaccio/e2e-cli-pnpm7 +# @verdaccio/e2e-cli-pnpm9 -## 1.0.1-6-next.5 +## 1.0.2-next-8.0 ### Patch Changes -- @verdaccio/test-cli-commons@1.0.1-6-next.5 - -## 1.0.1-6-next.4 - -### Patch Changes - -- @verdaccio/test-cli-commons@1.0.1-6-next.4 - -## 1.0.1-6-next.3 - -### Patch Changes - -- 351aeeaa: fix(deps): @verdaccio/utils should be a prod dep of local-storage -- Updated dependencies [351aeeaa] - - @verdaccio/test-cli-commons@1.0.1-6-next.3 - -## 1.0.1-6-next.2 - -### Patch Changes - -- @verdaccio/test-cli-commons@1.0.1-6-next.2 - -## 1.0.1-6-next.1 - -### Patch Changes - -- @verdaccio/test-cli-commons@1.0.1-6-next.1 - -## 1.0.1-6-next.0 - -### Patch Changes - -- @verdaccio/test-cli-commons@1.0.1-6-next.0 +- Updated dependencies + - @verdaccio/test-cli-commons@2.0.0-next-8.0 diff --git a/e2e/cli/e2e-pnpm9/audit.spec.ts b/e2e/cli/e2e-pnpm9/audit.spec.ts index 72c1284..2b748b9 100644 --- a/e2e/cli/e2e-pnpm9/audit.spec.ts +++ b/e2e/cli/e2e-pnpm9/audit.spec.ts @@ -1,45 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { pnpm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; +import { runAudit } from '@verdaccio/e2e-cli-pnpm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', '@verdaccio/cli']])( - 'should audit a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { jquery: '3.6.1' } - ); - // install is required to create package lock file - await pnpm({ cwd: tempFolder }, 'install', ...addRegistry(registry.getRegistryUrl())); - const resp = await pnpm( - { cwd: tempFolder }, - 'audit', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.metadata).toBeDefined(); - expect(parsedBody.actions).toBeDefined(); - expect(parsedBody.advisories).toBeDefined(); - expect(parsedBody.muted).toBeDefined(); - } - ); +import { pnpm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('audit a package', () => { + runAudit(pnpm); }); diff --git a/e2e/cli/e2e-pnpm9/deprecate.spec.ts b/e2e/cli/e2e-pnpm9/deprecate.spec.ts index 2e7ae0a..2d3f152 100644 --- a/e2e/cli/e2e-pnpm9/deprecate.spec.ts +++ b/e2e/cli/e2e-pnpm9/deprecate.spec.ts @@ -1,115 +1,9 @@ -import { - addRegistry, - initialSetup, - pnpmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runDeprecate } from '@verdaccio/e2e-cli-pnpm-common'; import { pnpm } from './utils'; describe('deprecate a package', () => { - jest.setTimeout(20000); - let registry; - - async function deprecate(tempFolder, packageVersion, registry, message) { - await pnpm( - { cwd: tempFolder }, - 'deprecate', - packageVersion, - message, - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - } - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/deprecated-1']])( - 'should deprecate a single package %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}`, registry); - expect(infoBody.name).toEqual(pkgName); - expect(infoBody.deprecated).toEqual(message); - } - ); - - test.each([['@verdaccio/deprecated-2']])('should un-deprecate a package %s', async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // deprecate one version - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, message); - // verify is deprecated - const infoBody = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}`, registry); - expect(infoBody.deprecated).toEqual(message); - // empty string is same as undeprecate - await deprecate(tempFolder, `${pkgName}@1.0.0`, registry, ''); - const infoBody2 = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}`, registry); - expect(infoBody2.deprecated).toBeUndefined(); - }); - - test.each([['@verdaccio/deprecated-3']])( - 'should deprecate a multiple packages %s', - async (pkgName) => { - const message = 'some message'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - // publish 1.0.0 - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // publish 1.1.0 - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // publish 1.2.0 - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // publish 1.3.0 - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - // // deprecate all version - await deprecate(tempFolder, pkgName, registry, message); - // verify is deprecated - for (let v of ['1.0.0', '1.1.0', '1.2.0', '1.3.0']) { - const infoResp = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}@${v}`, registry); - expect(infoResp.deprecated).toEqual(message); - } - // publish normal version - // publish 1.4.0 - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - const infoResp = await pnpmUtils.getInfoVersions(pnpm, `${pkgName}@1.4.0`, registry); - // must be not deprecated - expect(infoResp.deprecated).toBeUndefined(); - } - ); - - afterAll(async () => { - registry.stop(); - }); + runDeprecate(pnpm); }); diff --git a/e2e/cli/e2e-pnpm9/dist-tags.spec.ts b/e2e/cli/e2e-pnpm9/dist-tags.spec.ts index da9e7d9..a1fadc2 100644 --- a/e2e/cli/e2e-pnpm9/dist-tags.spec.ts +++ b/e2e/cli/e2e-pnpm9/dist-tags.spec.ts @@ -1,91 +1,9 @@ -import { - addRegistry, - initialSetup, - pnpmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { pnpm } from './utils'; - -describe('publish a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); +import { runDistTag } from '@verdaccio/e2e-cli-pnpm-common'; - test.each([['@foo/foo', 'foo']])('should list dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await pnpm( - { cwd: tempFolder }, - 'dist-tag', - 'ls', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('beta: 1.1.0latest: 1.0.0'); - }); - - test.each([['@verdaccio/bar']])('should remove tag with dist-tags for %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry, ['--tag', 'beta']); - const resp2 = await pnpm( - { cwd: tempFolder }, - 'dist-tag', - 'rm', - `${pkgName}@1.1.0`, - 'beta', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual('-beta: @verdaccio/bar@1.1.0'); - }); - - test.each([['@verdaccio/five']])( - 'should add tag to package and version with dist-tags for %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - await pnpmUtils.bumbUp(pnpm, tempFolder, registry); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - const resp2 = await pnpm( - { cwd: tempFolder }, - 'dist-tag', - 'add', - `${pkgName}@1.1.0`, - 'alfa', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp2.stdout).toEqual(`+alfa: ${pkgName}@1.1.0`); - } - ); +import { pnpm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('dist-tags a package', () => { + runDistTag(pnpm); }); diff --git a/e2e/cli/e2e-pnpm9/info.spec.ts b/e2e/cli/e2e-pnpm9/info.spec.ts index 2c49c21..e60ae17 100644 --- a/e2e/cli/e2e-pnpm9/info.spec.ts +++ b/e2e/cli/e2e-pnpm9/info.spec.ts @@ -1,31 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { pnpm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; +import { runInfo } from '@verdaccio/e2e-cli-pnpm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run pnpm info json body', async () => { - const resp = await pnpm( - {}, - 'info', - 'verdaccio', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual('verdaccio'); - expect(parsedBody.dependencies).toBeDefined(); - }); +import { pnpm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('info a package', () => { + runInfo(pnpm); }); diff --git a/e2e/cli/e2e-pnpm9/install.spec.ts b/e2e/cli/e2e-pnpm9/install.spec.ts index 77440d9..7cd30d1 100644 --- a/e2e/cli/e2e-pnpm9/install.spec.ts +++ b/e2e/cli/e2e-pnpm9/install.spec.ts @@ -1,36 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runInstall } from '@verdaccio/e2e-cli-pnpm-common'; import { pnpm } from './utils'; describe('install a project packages', () => { - jest.setTimeout(80000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should run npm install json body', async () => { - const { tempFolder } = await prepareGenericEmptyProject( - 'something', - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl(), - { react: '18.2.0' } - ); - const resp = await pnpm( - { cwd: tempFolder }, - 'install', - '--reporter=default', - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toMatch(/react/); - }); - - afterAll(async () => { - registry.stop(); - }); + runInstall(pnpm); }); diff --git a/e2e/cli/e2e-pnpm9/jest.config.js b/e2e/cli/e2e-pnpm9/jest.config.js deleted file mode 100644 index cd97591..0000000 --- a/e2e/cli/e2e-pnpm9/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../jest.config'); - -module.exports = { ...config }; diff --git a/e2e/cli/e2e-pnpm9/package.json b/e2e/cli/e2e-pnpm9/package.json index 71029cf..fe4af2c 100644 --- a/e2e/cli/e2e-pnpm9/package.json +++ b/e2e/cli/e2e-pnpm9/package.json @@ -1,12 +1,13 @@ { "private": true, - "name": "@verdaccio/e2e-cli-pnpm8", - "version": "1.0.1-6-next.5", + "name": "@verdaccio/e2e-cli-pnpm9", + "version": "1.0.2-next-8.0", "dependencies": { - "@verdaccio/test-cli-commons": "workspace:1.0.1-6-next.5", - "pnpm": "next-9" + "@verdaccio/test-cli-commons": "workspace:*", + "@verdaccio/e2e-cli-pnpm-common": "workspace:*", + "pnpm": "9.13.2" }, "scripts": { - "test": "jest" + "test": "vitest run --testTimeout 50000" } } diff --git a/e2e/cli/e2e-pnpm9/ping.spec.ts b/e2e/cli/e2e-pnpm9/ping.spec.ts index f8ae245..0a9b8b6 100644 --- a/e2e/cli/e2e-pnpm9/ping.spec.ts +++ b/e2e/cli/e2e-pnpm9/ping.spec.ts @@ -1,24 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runPing } from '@verdaccio/e2e-cli-pnpm-common'; import { pnpm } from './utils'; describe('ping registry', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should ping registry', async () => { - const resp = await pnpm({}, 'ping', '--json', ...addRegistry(registry.getRegistryUrl())); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.registry).toEqual(registry.getRegistryUrl() + '/'); - }); - - afterAll(async () => { - registry.stop(); - }); + runPing(pnpm); }); diff --git a/e2e/cli/e2e-pnpm9/publish.spec.ts b/e2e/cli/e2e-pnpm9/publish.spec.ts index 4a2a629..bbf2b52 100644 --- a/e2e/cli/e2e-pnpm9/publish.spec.ts +++ b/e2e/cli/e2e-pnpm9/publish.spec.ts @@ -1,41 +1,9 @@ -import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; -import { pnpm } from './utils'; - -describe('install a package', () => { - jest.setTimeout(10000); - let registry; +import { runPublish } from '@verdaccio/e2e-cli-pnpm-common'; - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['verdaccio-memory', 'verdaccio', '@verdaccio/foo', '@verdaccio/some-foo']])( - 'should publish a package %s', - async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - const resp = await pnpm( - { cwd: tempFolder }, - 'publish', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); - expect(parsedBody.files).toBeDefined(); - expect(parsedBody.files).toBeDefined(); - } - ); +import { pnpm } from './utils'; - afterAll(async () => { - registry.stop(); - }); +describe('publish a package', () => { + runPublish(pnpm); }); diff --git a/e2e/cli/e2e-pnpm9/search.spec.ts b/e2e/cli/e2e-pnpm9/search.spec.ts index ec06178..dee4962 100644 --- a/e2e/cli/e2e-pnpm9/search.spec.ts +++ b/e2e/cli/e2e-pnpm9/search.spec.ts @@ -1,33 +1,9 @@ -import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runSearch } from '@verdaccio/e2e-cli-pnpm-common'; import { pnpm } from './utils'; describe('search a package', () => { - jest.setTimeout(10000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test('should search a package', async () => { - const resp = await pnpm( - {}, - 'search', - '@verdaccio/cli', - '--json', - ...addRegistry(registry.getRegistryUrl()) - ); - const parsedBody = JSON.parse(resp.stdout as string); - const pkgFind = parsedBody.find((item) => { - return item.name === '@verdaccio/cli'; - }); - expect(pkgFind.name).toEqual('@verdaccio/cli'); - }); - - afterAll(async () => { - registry.stop(); - }); + runSearch(pnpm); }); diff --git a/e2e/cli/e2e-pnpm9/star.spec.ts b/e2e/cli/e2e-pnpm9/star.spec.ts index d0b906f..f21a53b 100644 --- a/e2e/cli/e2e-pnpm9/star.spec.ts +++ b/e2e/cli/e2e-pnpm9/star.spec.ts @@ -1,89 +1,9 @@ -import { - addRegistry, - initialSetup, - pnpmUtils, - prepareGenericEmptyProject, -} from '@verdaccio/test-cli-commons'; +import { describe } from 'vitest'; + +import { runStar } from '@verdaccio/e2e-cli-pnpm-common'; import { pnpm } from './utils'; describe('star a package', () => { - jest.setTimeout(20000); - let registry; - - beforeAll(async () => { - const setup = await initialSetup(); - registry = setup.registry; - await registry.init(); - }); - - test.each([['@verdaccio/foo']])('should star a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - const resp = await pnpm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - }); - - test.each([['@verdaccio/bar']])('should unstar a package %s', async (pkgName) => { - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - const resp = await pnpm( - { cwd: tempFolder }, - 'star', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp.stdout).toEqual(`★ ${pkgName}`); - - const resp1 = await pnpm( - { cwd: tempFolder }, - 'unstar', - pkgName, - ...addRegistry(registry.getRegistryUrl()) - ); - expect(resp1.stdout).toEqual(`☆ ${pkgName}`); - }); - - test('should list stars of a user %s', async () => { - const pkgName = '@verdaccio/stars'; - const { tempFolder } = await prepareGenericEmptyProject( - pkgName, - '1.0.0-patch', - registry.port, - registry.getToken(), - registry.getRegistryUrl() - ); - await pnpmUtils.publish(pnpm, tempFolder, pkgName, registry); - await pnpm({ cwd: tempFolder }, 'star', pkgName, ...addRegistry(registry.getRegistryUrl())); - const resp = await pnpm( - { cwd: tempFolder }, - 'stars', - ...addRegistry(registry.getRegistryUrl()) - ); - // side effects: this result is affected the the package published in the previous step - expect(resp.stdout).toEqual(`@verdaccio/foo@verdaccio/stars`); - }); - - afterAll(async () => { - registry.stop(); - }); + runStar(pnpm); }); diff --git a/e2e/cli/e2e-pnpm9/tsconfig.json b/e2e/cli/e2e-pnpm9/tsconfig.json index 85f4cec..a5e8431 100644 --- a/e2e/cli/e2e-pnpm9/tsconfig.json +++ b/e2e/cli/e2e-pnpm9/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "../../../tsconfig.reference.json", - "references": [ - { - "path": "../cli-commons" - } - ] + "extends": "../../../tsconfig.reference.json" } diff --git a/e2e/cli/e2e-pnpm9/unpublish.spec.ts b/e2e/cli/e2e-pnpm9/unpublish.spec.ts new file mode 100644 index 0000000..c71e2d2 --- /dev/null +++ b/e2e/cli/e2e-pnpm9/unpublish.spec.ts @@ -0,0 +1,9 @@ +import { describe } from 'vitest'; + +import { runUnpublish } from '@verdaccio/e2e-cli-pnpm-common'; + +import { pnpm } from './utils'; + +describe('unpublish a package', () => { + runUnpublish(pnpm); +}); diff --git a/e2e/cli/e2e-yarn1/CHANGELOG.md b/e2e/cli/e2e-yarn1/CHANGELOG.md index 5455e42..915d8c9 100644 --- a/e2e/cli/e2e-yarn1/CHANGELOG.md +++ b/e2e/cli/e2e-yarn1/CHANGELOG.md @@ -1,5 +1,36 @@ # @verdaccio/e2e-cli-yarn1 +## 1.0.2-next-8.0 + +### Patch Changes + +- Updated dependencies + - @verdaccio/test-cli-commons@2.0.0-next-8.0 + +## 1.0.1 + +### Patch Changes + +- 351aeeaa8: fix(deps): @verdaccio/utils should be a prod dep of local-storage +- Updated dependencies [351aeeaa8] +- Updated dependencies [d167f92e1] +- Updated dependencies [c383eb68c] + - @verdaccio/test-cli-commons@1.1.0 + +## 1.0.1-6-next.7 + +### Patch Changes + +- Updated dependencies [c383eb68] + - @verdaccio/test-cli-commons@1.1.0-6-next.7 + +## 1.0.1-6-next.6 + +### Patch Changes + +- Updated dependencies [d167f92e] + - @verdaccio/test-cli-commons@1.1.0-6-next.6 + ## 1.0.1-6-next.5 ### Patch Changes diff --git a/e2e/cli/e2e-yarn1/audit.spec.ts b/e2e/cli/e2e-yarn1/audit.spec.ts index d09f347..da35cc5 100644 --- a/e2e/cli/e2e-yarn1/audit.spec.ts +++ b/e2e/cli/e2e-yarn1/audit.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; import { yarn } from './utils'; describe('audit a package', () => { - jest.setTimeout(10000); let registry; beforeAll(async () => { diff --git a/e2e/cli/e2e-yarn1/config/_bootstrap_verdaccio.yaml b/e2e/cli/e2e-yarn1/config/_bootstrap_verdaccio.yaml index d0db1b5..56a7938 100644 --- a/e2e/cli/e2e-yarn1/config/_bootstrap_verdaccio.yaml +++ b/e2e/cli/e2e-yarn1/config/_bootstrap_verdaccio.yaml @@ -11,7 +11,7 @@ web: uplinks: npmjs: - url: https://rg.verdaccio.org/ + url: https://registry.verdaccio.org/ max_fails: 30 fail_timeout: 10m timeout: 60s diff --git a/e2e/cli/e2e-yarn1/info.spec.ts b/e2e/cli/e2e-yarn1/info.spec.ts index 96f97e4..84dff0b 100644 --- a/e2e/cli/e2e-yarn1/info.spec.ts +++ b/e2e/cli/e2e-yarn1/info.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { addRegistry, initialSetup } from '@verdaccio/test-cli-commons'; import { yarn } from './utils'; describe('install a package', () => { - jest.setTimeout(10000); let registry; beforeAll(async () => { diff --git a/e2e/cli/e2e-yarn1/install.spec.ts b/e2e/cli/e2e-yarn1/install.spec.ts index 8d21034..8ee5f03 100644 --- a/e2e/cli/e2e-yarn1/install.spec.ts +++ b/e2e/cli/e2e-yarn1/install.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; import { yarn } from './utils'; describe('install a project packages', () => { - jest.setTimeout(80000); let registry; beforeAll(async () => { diff --git a/e2e/cli/e2e-yarn1/jest.config.js b/e2e/cli/e2e-yarn1/jest.config.js deleted file mode 100644 index cd97591..0000000 --- a/e2e/cli/e2e-yarn1/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../jest.config'); - -module.exports = { ...config }; diff --git a/e2e/cli/e2e-yarn1/package.json b/e2e/cli/e2e-yarn1/package.json index cfdec36..1c3d323 100644 --- a/e2e/cli/e2e-yarn1/package.json +++ b/e2e/cli/e2e-yarn1/package.json @@ -1,12 +1,12 @@ { "private": true, "name": "@verdaccio/e2e-cli-yarn1", - "version": "1.0.1-6-next.5", + "version": "1.0.2-next-8.0", "dependencies": { - "@verdaccio/test-cli-commons": "workspace:1.0.1-6-next.5", - "yarn": "1.22.21" + "@verdaccio/test-cli-commons": "workspace:*", + "yarn": "1.22.22" }, "scripts": { - "test": "jest" + "test": "vitest run --testTimeout 50000" } } diff --git a/e2e/cli/e2e-yarn1/publish.spec.ts b/e2e/cli/e2e-yarn1/publish.spec.ts index 39c8417..9c68f2a 100644 --- a/e2e/cli/e2e-yarn1/publish.spec.ts +++ b/e2e/cli/e2e-yarn1/publish.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; import { yarn } from './utils'; describe('install a package', () => { - jest.setTimeout(10000); let registry; beforeAll(async () => { diff --git a/e2e/cli/e2e-yarn1/tag.spec.ts b/e2e/cli/e2e-yarn1/tag.spec.ts index af490eb..801c319 100644 --- a/e2e/cli/e2e-yarn1/tag.spec.ts +++ b/e2e/cli/e2e-yarn1/tag.spec.ts @@ -1,3 +1,5 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { addRegistry, initialSetup, prepareGenericEmptyProject } from '@verdaccio/test-cli-commons'; import { yarn } from './utils'; @@ -7,7 +9,6 @@ export async function bumbUp(tempFolder, registry) { } describe('install a package', () => { - jest.setTimeout(20000); let registry; beforeAll(async () => { diff --git a/e2e/cli/e2e-yarn1/tsconfig.json b/e2e/cli/e2e-yarn1/tsconfig.json index 85f4cec..a1310f1 100644 --- a/e2e/cli/e2e-yarn1/tsconfig.json +++ b/e2e/cli/e2e-yarn1/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "../../../tsconfig.reference.json", - "references": [ - { - "path": "../cli-commons" - } - ] + "extends": "../../../tsconfig.reference.json" } diff --git a/e2e/cli/e2e-yarn2/CHANGELOG.md b/e2e/cli/e2e-yarn2/CHANGELOG.md index 58d13ec..ea8719d 100644 --- a/e2e/cli/e2e-yarn2/CHANGELOG.md +++ b/e2e/cli/e2e-yarn2/CHANGELOG.md @@ -1,5 +1,36 @@ # @verdaccio/e2e-cli-yarn2 +## 1.0.2-next-8.0 + +### Patch Changes + +- Updated dependencies + - @verdaccio/test-cli-commons@2.0.0-next-8.0 + +## 1.0.1 + +### Patch Changes + +- 351aeeaa8: fix(deps): @verdaccio/utils should be a prod dep of local-storage +- Updated dependencies [351aeeaa8] +- Updated dependencies [d167f92e1] +- Updated dependencies [c383eb68c] + - @verdaccio/test-cli-commons@1.1.0 + +## 1.0.1-6-next.7 + +### Patch Changes + +- Updated dependencies [c383eb68] + - @verdaccio/test-cli-commons@1.1.0-6-next.7 + +## 1.0.1-6-next.6 + +### Patch Changes + +- Updated dependencies [d167f92e] + - @verdaccio/test-cli-commons@1.1.0-6-next.6 + ## 1.0.1-6-next.5 ### Patch Changes diff --git a/e2e/cli/e2e-yarn2/audit.spec.ts b/e2e/cli/e2e-yarn2/audit.spec.ts index 197bb93..54830ea 100644 --- a/e2e/cli/e2e-yarn2/audit.spec.ts +++ b/e2e/cli/e2e-yarn2/audit.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { initialSetup, yarnModernUtils } from '@verdaccio/test-cli-commons'; import { getYarnCommand, yarn } from './utils'; describe('audit a package yarn 2', () => { - jest.setTimeout(10000); let registry; let projectFolder; @@ -18,15 +19,18 @@ describe('audit a package yarn 2', () => { { packageName: '@scope/name', version: '1.0.0', - dependencies: { verdaccio: '5.24.1' }, + dependencies: { aaa: 'latest' }, devDependencies: {}, } ); projectFolder = tempFolder; }); - test.skip('should run yarn npm audit info json body', async () => { + test('should run yarn npm audit info json body', async () => { await yarn(projectFolder, 'install'); + // this might fails if the dependency used above has vulnerabilities + // always try to use ar real dependency that does not have such issues + // yarn berry uses exit 1 if has error https://github.com/yarnpkg/berry/pull/4358 const resp = await yarn(projectFolder, 'npm', 'audit', '--json'); const parsedBody = JSON.parse(resp.stdout as string); expect(parsedBody.advisories).toBeDefined(); diff --git a/e2e/cli/e2e-yarn2/info.spec.ts b/e2e/cli/e2e-yarn2/info.spec.ts index ecf118a..f9f25cc 100644 --- a/e2e/cli/e2e-yarn2/info.spec.ts +++ b/e2e/cli/e2e-yarn2/info.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { initialSetup, yarnModernUtils } from '@verdaccio/test-cli-commons'; import { getYarnCommand, yarn } from './utils'; describe('install a package', () => { - jest.setTimeout(20000); let registry; let projectFolder; @@ -29,7 +30,7 @@ describe('install a package', () => { const resp = await yarn(projectFolder, 'npm', 'info', 'react', '--json'); const parsedBody = JSON.parse(resp.stdout as string); expect(parsedBody.name).toEqual('react'); - expect(parsedBody.dependencies).toBeDefined(); + expect(parsedBody.versions).toBeDefined(); }); afterAll(async () => { diff --git a/e2e/cli/e2e-yarn2/install.spec.ts b/e2e/cli/e2e-yarn2/install.spec.ts index ffaf9a3..501836a 100644 --- a/e2e/cli/e2e-yarn2/install.spec.ts +++ b/e2e/cli/e2e-yarn2/install.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { initialSetup, yarnModernUtils } from '@verdaccio/test-cli-commons'; import { getYarnCommand, yarn } from './utils'; describe('install a packages', () => { - jest.setTimeout(20000); let registry; let projectFolder; diff --git a/e2e/cli/e2e-yarn2/jest.config.js b/e2e/cli/e2e-yarn2/jest.config.js deleted file mode 100644 index cd97591..0000000 --- a/e2e/cli/e2e-yarn2/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../jest.config'); - -module.exports = { ...config }; diff --git a/e2e/cli/e2e-yarn2/package.json b/e2e/cli/e2e-yarn2/package.json index c3e8a5b..a849175 100644 --- a/e2e/cli/e2e-yarn2/package.json +++ b/e2e/cli/e2e-yarn2/package.json @@ -1,12 +1,12 @@ { "private": true, "name": "@verdaccio/e2e-cli-yarn2", - "version": "1.0.1-6-next.5", + "version": "1.0.2-next-8.0", "dependencies": { - "@verdaccio/test-cli-commons": "workspace:1.0.1-6-next.5", + "@verdaccio/test-cli-commons": "workspace:*", "@yarnpkg/cli-dist": "2.4.2" }, "scripts": { - "test": "jest" + "test": "vitest run --testTimeout 50000" } } diff --git a/e2e/cli/e2e-yarn2/publish.spec.ts b/e2e/cli/e2e-yarn2/publish.spec.ts index a89dd51..767172f 100644 --- a/e2e/cli/e2e-yarn2/publish.spec.ts +++ b/e2e/cli/e2e-yarn2/publish.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { initialSetup, yarnModernUtils } from '@verdaccio/test-cli-commons'; import { getYarnCommand, yarn } from './utils'; describe('install a packages', () => { - jest.setTimeout(20000); let registry; let projectFolder; diff --git a/e2e/cli/e2e-yarn2/tsconfig.json b/e2e/cli/e2e-yarn2/tsconfig.json index 85f4cec..a1310f1 100644 --- a/e2e/cli/e2e-yarn2/tsconfig.json +++ b/e2e/cli/e2e-yarn2/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "../../../tsconfig.reference.json", - "references": [ - { - "path": "../cli-commons" - } - ] + "extends": "../../../tsconfig.reference.json" } diff --git a/e2e/cli/e2e-yarn3/CHANGELOG.md b/e2e/cli/e2e-yarn3/CHANGELOG.md index 0462dde..f4d34c2 100644 --- a/e2e/cli/e2e-yarn3/CHANGELOG.md +++ b/e2e/cli/e2e-yarn3/CHANGELOG.md @@ -1,5 +1,36 @@ # @verdaccio/e2e-cli-yarn3 +## 1.0.2-next-8.0 + +### Patch Changes + +- Updated dependencies + - @verdaccio/test-cli-commons@2.0.0-next-8.0 + +## 1.0.1 + +### Patch Changes + +- 351aeeaa8: fix(deps): @verdaccio/utils should be a prod dep of local-storage +- Updated dependencies [351aeeaa8] +- Updated dependencies [d167f92e1] +- Updated dependencies [c383eb68c] + - @verdaccio/test-cli-commons@1.1.0 + +## 1.0.1-6-next.7 + +### Patch Changes + +- Updated dependencies [c383eb68] + - @verdaccio/test-cli-commons@1.1.0-6-next.7 + +## 1.0.1-6-next.6 + +### Patch Changes + +- Updated dependencies [d167f92e] + - @verdaccio/test-cli-commons@1.1.0-6-next.6 + ## 1.0.1-6-next.5 ### Patch Changes diff --git a/e2e/cli/e2e-yarn3/audit.spec.ts b/e2e/cli/e2e-yarn3/audit.spec.ts index afe016f..ff7c977 100644 --- a/e2e/cli/e2e-yarn3/audit.spec.ts +++ b/e2e/cli/e2e-yarn3/audit.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { initialSetup, yarnModernUtils } from '@verdaccio/test-cli-commons'; import { getYarnCommand, yarn } from './utils'; describe('audit a package yarn 3', () => { - jest.setTimeout(10000); let registry; let projectFolder; @@ -12,21 +13,24 @@ describe('audit a package yarn 3', () => { registry = setup.registry; await registry.init(); const { tempFolder } = await yarnModernUtils.prepareYarnModernProject( - 'yarn-2', + 'yarn-3', registry.getRegistryUrl(), getYarnCommand(), { packageName: '@scope/name', version: '1.0.0', - dependencies: { jquery: '3.0.0' }, + dependencies: { aaa: 'latest' }, devDependencies: {}, } ); projectFolder = tempFolder; }); - test.skip('should run yarn npm audit info json body', async () => { + test('should run yarn npm audit info json body', async () => { await yarn(projectFolder, 'install'); + // this might fails if the dependency used above has vulnerabilities + // always try to use ar real dependency that does not have such issues + // yarn berry uses exit 1 if has error https://github.com/yarnpkg/berry/pull/4358 const resp = await yarn(projectFolder, 'npm', 'audit', '--json'); const parsedBody = JSON.parse(resp.stdout as string); expect(parsedBody.advisories).toBeDefined(); diff --git a/e2e/cli/e2e-yarn3/info.spec.ts b/e2e/cli/e2e-yarn3/info.spec.ts index ecf118a..f9f25cc 100644 --- a/e2e/cli/e2e-yarn3/info.spec.ts +++ b/e2e/cli/e2e-yarn3/info.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { initialSetup, yarnModernUtils } from '@verdaccio/test-cli-commons'; import { getYarnCommand, yarn } from './utils'; describe('install a package', () => { - jest.setTimeout(20000); let registry; let projectFolder; @@ -29,7 +30,7 @@ describe('install a package', () => { const resp = await yarn(projectFolder, 'npm', 'info', 'react', '--json'); const parsedBody = JSON.parse(resp.stdout as string); expect(parsedBody.name).toEqual('react'); - expect(parsedBody.dependencies).toBeDefined(); + expect(parsedBody.versions).toBeDefined(); }); afterAll(async () => { diff --git a/e2e/cli/e2e-yarn3/install.spec.ts b/e2e/cli/e2e-yarn3/install.spec.ts index ffaf9a3..501836a 100644 --- a/e2e/cli/e2e-yarn3/install.spec.ts +++ b/e2e/cli/e2e-yarn3/install.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { initialSetup, yarnModernUtils } from '@verdaccio/test-cli-commons'; import { getYarnCommand, yarn } from './utils'; describe('install a packages', () => { - jest.setTimeout(20000); let registry; let projectFolder; diff --git a/e2e/cli/e2e-yarn3/jest.config.js b/e2e/cli/e2e-yarn3/jest.config.js deleted file mode 100644 index cd97591..0000000 --- a/e2e/cli/e2e-yarn3/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../jest.config'); - -module.exports = { ...config }; diff --git a/e2e/cli/e2e-yarn3/package.json b/e2e/cli/e2e-yarn3/package.json index 9033dc2..6f9124d 100644 --- a/e2e/cli/e2e-yarn3/package.json +++ b/e2e/cli/e2e-yarn3/package.json @@ -1,12 +1,12 @@ { "private": true, "name": "@verdaccio/e2e-cli-yarn3", - "version": "1.0.1-6-next.5", + "version": "1.0.2-next-8.0", "dependencies": { - "@verdaccio/test-cli-commons": "workspace:1.0.1-6-next.5", - "@yarnpkg/cli-dist": "3.8.1" + "@verdaccio/test-cli-commons": "workspace:*", + "@yarnpkg/cli-dist": "3.8.3" }, "scripts": { - "test": "jest" + "test": "vitest run --testTimeout 50000" } } diff --git a/e2e/cli/e2e-yarn3/publish.spec.ts b/e2e/cli/e2e-yarn3/publish.spec.ts index a89dd51..767172f 100644 --- a/e2e/cli/e2e-yarn3/publish.spec.ts +++ b/e2e/cli/e2e-yarn3/publish.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { initialSetup, yarnModernUtils } from '@verdaccio/test-cli-commons'; import { getYarnCommand, yarn } from './utils'; describe('install a packages', () => { - jest.setTimeout(20000); let registry; let projectFolder; diff --git a/e2e/cli/e2e-yarn3/tsconfig.json b/e2e/cli/e2e-yarn3/tsconfig.json index 85f4cec..a1310f1 100644 --- a/e2e/cli/e2e-yarn3/tsconfig.json +++ b/e2e/cli/e2e-yarn3/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "../../../tsconfig.reference.json", - "references": [ - { - "path": "../cli-commons" - } - ] + "extends": "../../../tsconfig.reference.json" } diff --git a/e2e/cli/e2e-yarn4/CHANGELOG.md b/e2e/cli/e2e-yarn4/CHANGELOG.md index 99f7ffe..939dbe4 100644 --- a/e2e/cli/e2e-yarn4/CHANGELOG.md +++ b/e2e/cli/e2e-yarn4/CHANGELOG.md @@ -1,5 +1,12 @@ # @verdaccio/e2e-cli-yarn4 +## 1.0.2-next-8.0 + +### Patch Changes + +- Updated dependencies + - @verdaccio/test-cli-commons@2.0.0-next-8.0 + ## 1.0.1 ### Patch Changes diff --git a/e2e/cli/e2e-yarn4/info.spec.ts b/e2e/cli/e2e-yarn4/info.spec.ts index ecf118a..f9f25cc 100644 --- a/e2e/cli/e2e-yarn4/info.spec.ts +++ b/e2e/cli/e2e-yarn4/info.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { initialSetup, yarnModernUtils } from '@verdaccio/test-cli-commons'; import { getYarnCommand, yarn } from './utils'; describe('install a package', () => { - jest.setTimeout(20000); let registry; let projectFolder; @@ -29,7 +30,7 @@ describe('install a package', () => { const resp = await yarn(projectFolder, 'npm', 'info', 'react', '--json'); const parsedBody = JSON.parse(resp.stdout as string); expect(parsedBody.name).toEqual('react'); - expect(parsedBody.dependencies).toBeDefined(); + expect(parsedBody.versions).toBeDefined(); }); afterAll(async () => { diff --git a/e2e/cli/e2e-yarn4/install.spec.ts b/e2e/cli/e2e-yarn4/install.spec.ts index ffaf9a3..46ede43 100644 --- a/e2e/cli/e2e-yarn4/install.spec.ts +++ b/e2e/cli/e2e-yarn4/install.spec.ts @@ -1,9 +1,11 @@ +import { afterAll, beforeAll, describe, expect, test, vi } from 'vitest'; + import { initialSetup, yarnModernUtils } from '@verdaccio/test-cli-commons'; import { getYarnCommand, yarn } from './utils'; describe('install a packages', () => { - jest.setTimeout(20000); + vi.setConfig({ testTimeout: 90000 }); let registry; let projectFolder; diff --git a/e2e/cli/e2e-yarn4/jest.config.js b/e2e/cli/e2e-yarn4/jest.config.js deleted file mode 100644 index cd97591..0000000 --- a/e2e/cli/e2e-yarn4/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../jest.config'); - -module.exports = { ...config }; diff --git a/e2e/cli/e2e-yarn4/package.json b/e2e/cli/e2e-yarn4/package.json index dd60b3f..d6d52ad 100644 --- a/e2e/cli/e2e-yarn4/package.json +++ b/e2e/cli/e2e-yarn4/package.json @@ -1,12 +1,12 @@ { "private": true, "name": "@verdaccio/e2e-cli-yarn4", - "version": "1.0.1", + "version": "1.0.2-next-8.0", "dependencies": { - "@yarnpkg/cli-dist": "4.1.1", - "@verdaccio/test-cli-commons": "workspace:1.0.1-6-next.5" + "@yarnpkg/cli-dist": "4.4.0", + "@verdaccio/test-cli-commons": "workspace:*" }, "scripts": { - "test": "jest" + "test": "vitest run --testTimeout 80000" } } diff --git a/e2e/cli/e2e-yarn4/publish.spec.ts b/e2e/cli/e2e-yarn4/publish.spec.ts index a89dd51..767172f 100644 --- a/e2e/cli/e2e-yarn4/publish.spec.ts +++ b/e2e/cli/e2e-yarn4/publish.spec.ts @@ -1,9 +1,10 @@ +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + import { initialSetup, yarnModernUtils } from '@verdaccio/test-cli-commons'; import { getYarnCommand, yarn } from './utils'; describe('install a packages', () => { - jest.setTimeout(20000); let registry; let projectFolder; diff --git a/e2e/cli/e2e-yarn4/tsconfig.json b/e2e/cli/e2e-yarn4/tsconfig.json index 85f4cec..a1310f1 100644 --- a/e2e/cli/e2e-yarn4/tsconfig.json +++ b/e2e/cli/e2e-yarn4/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "../../../tsconfig.reference.json", - "references": [ - { - "path": "../cli-commons" - } - ] + "extends": "../../../tsconfig.reference.json" } diff --git a/e2e/ui/package.json b/e2e/ui/package.json index 8cc2a5e..a1a2a2d 100644 --- a/e2e/ui/package.json +++ b/e2e/ui/package.json @@ -3,7 +3,7 @@ "name": "@verdaccio/e2e-ui", "version": "2.0.0-6-next.3", "devDependencies": { - "@verdaccio/test-cli-commons": "workspace:1.0.1-6-next.5", + "@verdaccio/test-cli-commons": "workspace:*", "npm": "next-8", "debug": "4.3.4", "cypress": "11.2.0" diff --git a/package.json b/package.json index fb7fb2f..ec9d05d 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@babel/cli": "7.23.9", "@babel/core": "7.23.9", "@babel/node": "7.23.9", + "@vitest/coverage-v8": "3.0.4", "@babel/plugin-proposal-class-properties": "7.18.6", "@babel/plugin-proposal-decorators": "7.23.9", "@babel/plugin-proposal-export-namespace-from": "7.18.9", @@ -42,7 +43,7 @@ "@types/jest": "27.5.2", "@types/lodash": "4.14.202", "@types/node": "20.11.19", - "@verdaccio/types": "11.0.0-6-next.25", + "@verdaccio/types": "next-8", "babel-core": "7.0.0-bridge.0", "babel-jest": "29.7.0", "babel-plugin-dynamic-import-node": "2.3.3", @@ -52,6 +53,7 @@ "fs-extra": "10.1.0", "husky": "7.0.4", "jest": "29.7.0", + "vitest": "3.0.4", "kleur": "3.0.3", "lint-staged": "11.2.6", "prettier": "2.8.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0eea7c..daddd74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -94,8 +94,11 @@ importers: specifier: 20.11.19 version: 20.11.19 '@verdaccio/types': - specifier: 11.0.0-6-next.25 - version: 11.0.0-6-next.25 + specifier: next-8 + version: 13.0.0-next-8.2 + '@vitest/coverage-v8': + specifier: 3.0.4 + version: 3.0.4(vitest@3.0.4) babel-core: specifier: 7.0.0-bridge.0 version: 7.0.0-bridge.0(@babel/core@7.23.9) @@ -141,101 +144,122 @@ importers: update-ts-references: specifier: 2.8.0 version: 2.8.0 + vitest: + specifier: 3.0.4 + version: 3.0.4(@types/node@20.11.19) - e2e/cli/e2e-npm10: + e2e/cli/e2e-npm-commons: dependencies: '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../../tools/cli-commons - npm: - specifier: next-10 - version: 10.1.0 - e2e/cli/e2e-npm6: + e2e/cli/e2e-npm10: dependencies: + '@verdaccio/e2e-cli-npm-common': + specifier: workspace:* + version: link:../e2e-npm-commons '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../../tools/cli-commons npm: - specifier: next-6 - version: 6.14.18 + specifier: 10.9.2 + version: 10.9.2 e2e/cli/e2e-npm7: dependencies: + '@verdaccio/e2e-cli-npm-common': + specifier: workspace:* + version: link:../e2e-npm-commons '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../../tools/cli-commons npm: - specifier: next-7 + specifier: 7.24.2 version: 7.24.2 e2e/cli/e2e-npm8: dependencies: + '@verdaccio/e2e-cli-npm-common': + specifier: workspace:* + version: link:../e2e-npm-commons '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../../tools/cli-commons npm: - specifier: next-8 + specifier: 8.19.4 version: 8.19.4 e2e/cli/e2e-npm9: dependencies: + '@verdaccio/e2e-cli-npm-common': + specifier: workspace:* + version: link:../e2e-npm-commons '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../../tools/cli-commons npm: - specifier: next-9 - version: 9.8.1 + specifier: 9.9.3 + version: 9.9.3 - e2e/cli/e2e-pnpm6: + e2e/cli/e2e-pnpm-commons: dependencies: '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../../tools/cli-commons pnpm: - specifier: latest-6 - version: 6.35.1 + specifier: 9.15.4 + version: 9.15.4 - e2e/cli/e2e-pnpm7: + e2e/cli/e2e-pnpm10: dependencies: + '@verdaccio/e2e-cli-pnpm-common': + specifier: workspace:* + version: link:../e2e-pnpm-commons '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../../tools/cli-commons pnpm: - specifier: next-7 - version: 7.33.6 + specifier: 10.0.0-alpha.2 + version: 10.0.0-alpha.2 e2e/cli/e2e-pnpm8: dependencies: + '@verdaccio/e2e-cli-pnpm-common': + specifier: workspace:* + version: link:../e2e-pnpm-commons '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../../tools/cli-commons pnpm: - specifier: next-8 - version: 8.7.6 + specifier: 8.15.9 + version: 8.15.9 e2e/cli/e2e-pnpm9: dependencies: + '@verdaccio/e2e-cli-pnpm-common': + specifier: workspace:* + version: link:../e2e-pnpm-commons '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../../tools/cli-commons pnpm: - specifier: next-9 - version: 9.0.6 + specifier: 9.13.2 + version: 9.13.2 e2e/cli/e2e-yarn1: dependencies: '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../../tools/cli-commons yarn: - specifier: 1.22.21 - version: 1.22.21 + specifier: 1.22.22 + version: 1.22.22 e2e/cli/e2e-yarn2: dependencies: '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../../tools/cli-commons '@yarnpkg/cli-dist': specifier: 2.4.2 @@ -244,25 +268,25 @@ importers: e2e/cli/e2e-yarn3: dependencies: '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../../tools/cli-commons '@yarnpkg/cli-dist': - specifier: 3.8.1 - version: 3.8.1 + specifier: 3.8.3 + version: 3.8.3 e2e/cli/e2e-yarn4: dependencies: '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../../tools/cli-commons '@yarnpkg/cli-dist': - specifier: 4.1.1 - version: 4.1.1 + specifier: 4.4.0 + version: 4.4.0 e2e/ui: devDependencies: '@verdaccio/test-cli-commons': - specifier: workspace:1.0.1-6-next.5 + specifier: workspace:* version: link:../../tools/cli-commons cypress: specifier: 11.2.0 @@ -277,41 +301,38 @@ importers: tools/cli-commons: devDependencies: '@verdaccio/config': - specifier: latest - version: 6.0.0-6-next.76 + specifier: next-8 + version: 8.0.0-next-8.7 '@verdaccio/core': - specifier: latest - version: 6.0.0-6-next.76 + specifier: next-8 + version: 8.0.0-next-8.7 '@verdaccio/types': - specifier: 6-next - version: 11.0.0-6-next.25 + specifier: next-8 + version: 13.0.0-next-8.2 '@verdaccio/utils': - specifier: latest - version: 6.0.0-6-next.44 + specifier: next-8 + version: 8.1.0-next-8.7 debug: - specifier: 4.3.4 - version: 4.3.4(supports-color@8.1.1) + specifier: 4.4.0 + version: 4.4.0(supports-color@8.1.1) fs-extra: - specifier: 10.1.0 - version: 10.1.0 + specifier: 11.2.0 + version: 11.2.0 get-port: specifier: 5.1.1 version: 5.1.1 got: specifier: 11.8.5 version: 11.8.5 + js-yaml: + specifier: 4.1.0 + version: 4.1.0 lodash: specifier: 4.17.21 version: 4.17.21 - nock: - specifier: 13.5.1 - version: 13.5.1 verdaccio: specifier: 7.0.0-d146790.0 version: 7.0.0-d146790.0(typanion@3.13.0) - yaml: - specifier: 2.3.4 - version: 2.3.4 packages: @@ -323,6 +344,14 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + /@babel/cli@7.23.9(@babel/core@7.23.9): resolution: {integrity: sha512-vB1UXmGDNEhcf1jNAHKT9IlYk1R+hehVTLFlCLHBi8gfuHQGP6uRjgXVYU0EVlI/qwAWpstqkBdf2aez3/z/5Q==} engines: {node: '>=6.9.0'} @@ -376,7 +405,7 @@ packages: '@babel/traverse': 7.23.7 '@babel/types': 7.23.6 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -399,7 +428,7 @@ packages: '@babel/traverse': 7.23.9 '@babel/types': 7.23.9 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -557,7 +586,7 @@ packages: '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.3 transitivePeerDependencies: @@ -707,11 +736,21 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-string-parser@7.25.9: + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-identifier@7.25.9: + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-option@7.22.15: resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} @@ -810,6 +849,14 @@ packages: '@babel/types': 7.23.9 dev: true + /@babel/parser@7.26.7: + resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.26.7 + dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} engines: {node: '>=6.9.0'} @@ -2019,7 +2066,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.23.6 '@babel/types': 7.23.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -2037,7 +2084,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.23.6 '@babel/types': 7.23.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -2055,7 +2102,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.23.9 '@babel/types': 7.23.9 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -2114,10 +2161,23 @@ packages: to-fast-properties: 2.0.0 dev: true + /@babel/types@7.26.7: + resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + dev: true + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true + /@bcoe/v8-coverage@1.0.2: + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + dev: true + /@colors/colors@1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -2184,6 +2244,231 @@ packages: resolution: {integrity: sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==} dev: true + /@esbuild/aix-ppc64@0.24.2: + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.24.2: + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.24.2: + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.24.2: + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.24.2: + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.24.2: + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.24.2: + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.24.2: + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.24.2: + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.24.2: + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.24.2: + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.24.2: + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.24.2: + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.24.2: + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.24.2: + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.24.2: + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.24.2: + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-arm64@0.24.2: + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.24.2: + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-arm64@0.24.2: + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.24.2: + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.24.2: + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.24.2: + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.24.2: + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.24.2: + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@formatjs/cli@2.15.0: resolution: {integrity: sha512-Hv7Z3xeGcgTpn1jA1/x7tc9UYbF9Udn/77xRf7E22Vn1mGJM/DftVqnpgLeNpd0d3xSftYw+rhaShNO19BsT6A==} hasBin: true @@ -2228,6 +2513,18 @@ packages: typescript: 4.9.5 dev: true + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -2467,6 +2764,15 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true + /@jridgewell/gen-mapping@0.3.8: + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} @@ -2477,6 +2783,11 @@ packages: engines: {node: '>=6.0.0'} dev: true + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true @@ -2485,6 +2796,10 @@ packages: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + dev: true + /@jridgewell/trace-mapping@0.3.18: resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} dependencies: @@ -2492,6 +2807,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3: resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} requiresBuild: true @@ -2519,6 +2841,165 @@ packages: fastq: 1.15.0 dev: true + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm-eabi@4.34.0: + resolution: {integrity: sha512-Eeao7ewDq79jVEsrtWIj5RNqB8p2knlm9fhR6uJ2gqP7UfbLrTrxevudVrEPDM7Wkpn/HpRC2QfazH7MXLz3vQ==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.34.0: + resolution: {integrity: sha512-yVh0Kf1f0Fq4tWNf6mWcbQBCLDpDrDEl88lzPgKhrgTcDrTtlmun92ywEF9dCjmYO3EFiSuJeeo9cYRxl2FswA==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.34.0: + resolution: {integrity: sha512-gCs0ErAZ9s0Osejpc3qahTsqIPUDjSKIyxK/0BGKvL+Tn0n3Kwvj8BrCv7Y5sR1Ypz1K2qz9Ny0VvkVyoXBVUQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.34.0: + resolution: {integrity: sha512-aIB5Anc8hngk15t3GUkiO4pv42ykXHfmpXGS+CzM9CTyiWyT8HIS5ygRAy7KcFb/wiw4Br+vh1byqcHRTfq2tQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-freebsd-arm64@4.34.0: + resolution: {integrity: sha512-kpdsUdMlVJMRMaOf/tIvxk8TQdzHhY47imwmASOuMajg/GXpw8GKNd8LNwIHE5Yd1onehNpcUB9jHY6wgw9nHQ==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-freebsd-x64@4.34.0: + resolution: {integrity: sha512-D0RDyHygOBCQiqookcPevrvgEarN0CttBecG4chOeIYCNtlKHmf5oi5kAVpXV7qs0Xh/WO2RnxeicZPtT50V0g==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.34.0: + resolution: {integrity: sha512-mCIw8j5LPDXmCOW8mfMZwT6F/Kza03EnSr4wGYEswrEfjTfVsFOxvgYfuRMxTuUF/XmRb9WSMD5GhCWDe2iNrg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.34.0: + resolution: {integrity: sha512-AwwldAu4aCJPob7zmjuDUMvvuatgs8B/QiVB0KwkUarAcPB3W+ToOT+18TQwY4z09Al7G0BvCcmLRop5zBLTag==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.34.0: + resolution: {integrity: sha512-e7kDUGVP+xw05pV65ZKb0zulRploU3gTu6qH1qL58PrULDGxULIS0OSDQJLH7WiFnpd3ZKUU4VM3u/Z7Zw+e7Q==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.34.0: + resolution: {integrity: sha512-SXYJw3zpwHgaBqTXeAZ31qfW/v50wq4HhNVvKFhRr5MnptRX2Af4KebLWR1wpxGJtLgfS2hEPuALRIY3LPAAcA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-loongarch64-gnu@4.34.0: + resolution: {integrity: sha512-e5XiCinINCI4RdyU3sFyBH4zzz7LiQRvHqDtRe9Dt8o/8hTBaYpdPimayF00eY2qy5j4PaaWK0azRgUench6WQ==} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.34.0: + resolution: {integrity: sha512-3SWN3e0bAsm9ToprLFBSro8nJe6YN+5xmB11N4FfNf92wvLye/+Rh5JGQtKOpwLKt6e61R1RBc9g+luLJsc23A==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.34.0: + resolution: {integrity: sha512-B1Oqt3GLh7qmhvfnc2WQla4NuHlcxAD5LyueUi5WtMc76ZWY+6qDtQYqnxARx9r+7mDGfamD+8kTJO0pKUJeJA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.34.0: + resolution: {integrity: sha512-UfUCo0h/uj48Jq2lnhX0AOhZPSTAq3Eostas+XZ+GGk22pI+Op1Y6cxQ1JkUuKYu2iU+mXj1QjPrZm9nNWV9rg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.34.0: + resolution: {integrity: sha512-chZLTUIPbgcpm+Z7ALmomXW8Zh+wE2icrG+K6nt/HenPLmtwCajhQC5flNSk1Xy5EDMt/QAOz2MhzfOfJOLSiA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.34.0: + resolution: {integrity: sha512-jo0UolK70O28BifvEsFD/8r25shFezl0aUk2t0VJzREWHkq19e+pcLu4kX5HiVXNz5qqkD+aAq04Ct8rkxgbyQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.34.0: + resolution: {integrity: sha512-Vmg0NhAap2S54JojJchiu5An54qa6t/oKT7LmDaWggpIcaiL8WcWHEN6OQrfTdL6mQ2GFyH7j2T5/3YPEDOOGA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.34.0: + resolution: {integrity: sha512-CV2aqhDDOsABKHKhNcs1SZFryffQf8vK2XrxP6lxC99ELZAdvsDgPklIBfd65R8R+qvOm1SmLaZ/Fdq961+m7A==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.34.0: + resolution: {integrity: sha512-g2ASy1QwHP88y5KWvblUolJz9rN+i4ZOsYzkEwcNfaNooxNUXG+ON6F5xFo0NIItpHqxcdAyls05VXpBnludGw==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true @@ -2603,6 +3084,10 @@ packages: '@types/responselike': 1.0.0 dev: true + /@types/estree@1.0.6: + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + dev: true + /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: @@ -2716,7 +3201,7 @@ packages: '@verdaccio/loaders': 8.0.0-next-8.4 '@verdaccio/signature': 8.0.0-next-8.1 '@verdaccio/utils': 8.1.0-next-8.7 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) lodash: 4.17.21 verdaccio-htpasswd: 13.0.0-next-8.7 transitivePeerDependencies: @@ -2731,28 +3216,13 @@ packages: http-status-codes: 2.2.0 dev: true - /@verdaccio/config@6.0.0-6-next.76: - resolution: {integrity: sha512-iWmmi+8pDedpwbRw43K19+Ky+DBYwcQ3L9hQNkG4KrhGdJsy7it6bpcjmxrh4xX39jQ00bqyq6Hb4cCGl7zlRQ==} - engines: {node: '>=12'} - dependencies: - '@verdaccio/core': 6.0.0-6-next.76 - '@verdaccio/utils': 6.0.0-6-next.44 - debug: 4.3.4(supports-color@8.1.1) - js-yaml: 4.1.0 - lodash: 4.17.21 - minimatch: 3.1.2 - yup: 0.32.11 - transitivePeerDependencies: - - supports-color - dev: true - /@verdaccio/config@8.0.0-next-8.7: resolution: {integrity: sha512-pA0WCWvvWY6vPRav+X0EuFmuK6M08zIpRzTKkqSriCWk6JUCZ07TDnN054AS8TSSOy6EaWgHxnUw3nTd34Z4Sg==} engines: {node: '>=18'} dependencies: '@verdaccio/core': 8.0.0-next-8.7 '@verdaccio/utils': 8.1.0-next-8.7 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) js-yaml: 4.1.0 lodash: 4.17.21 minimatch: 7.4.6 @@ -2760,18 +3230,6 @@ packages: - supports-color dev: true - /@verdaccio/core@6.0.0-6-next.76: - resolution: {integrity: sha512-1Jr4Ft61GWAKRlv8joGNa9e/zyaqm7FTP8qkKNl84LEjpmUomn5UrXYbiq4d1DESd7SVVQEfpRmYp1wnPniSHQ==} - engines: {node: '>=12'} - dependencies: - ajv: 8.12.0 - core-js: 3.30.2 - http-errors: 2.0.0 - http-status-codes: 2.2.0 - process-warning: 1.0.0 - semver: 7.5.4 - dev: true - /@verdaccio/core@7.0.0-next.1: resolution: {integrity: sha512-0cHibUcA7EFjMzBq06WEQ4CQxnds+OZX5jVY6MEpQMtWbSiH40pIi9lDiQFKs6lbXXqidNjvY4J19T1zevQLlw==} engines: {node: '>=12'} @@ -2829,7 +3287,7 @@ packages: '@verdaccio/core': 8.0.0-next-8.7 '@verdaccio/logger': 8.0.0-next-8.7 core-js: 3.37.1 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) got-cjs: 12.5.4 handlebars: 4.7.8 transitivePeerDependencies: @@ -2885,7 +3343,7 @@ packages: '@verdaccio/core': 8.0.0-next-8.7 '@verdaccio/logger-prettify': 8.0.0-next-8.1 colorette: 2.0.20 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -2919,7 +3377,7 @@ packages: '@verdaccio/core': 8.0.0-next-8.7 '@verdaccio/url': 13.0.0-next-8.7 '@verdaccio/utils': 8.1.0-next-8.7 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) express: 4.21.2 express-rate-limit: 5.5.1 lodash: 4.17.21 @@ -2937,7 +3395,7 @@ packages: '@verdaccio/core': 8.0.0-next-8.7 '@verdaccio/utils': 8.1.0-next-8.7 JSONStream: 1.3.5 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) got-cjs: 12.5.4 hpagent: 1.2.0 lodash: 4.17.21 @@ -2958,7 +3416,7 @@ packages: '@verdaccio/core': 8.0.0-next-8.7 '@verdaccio/logger': 8.0.0-next-8.7 '@verdaccio/proxy': 8.0.0-next-8.7 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) lodash: 4.17.21 transitivePeerDependencies: - supports-color @@ -2986,7 +3444,7 @@ packages: '@verdaccio/core': 8.0.0-next-8.7 '@verdaccio/url': 13.0.0-next-8.7 '@verdaccio/utils': 8.1.0-next-8.7 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) gunzip-maybe: 1.4.2 lodash: 4.17.21 tar-stream: 3.1.7 @@ -2994,9 +3452,9 @@ packages: - supports-color dev: true - /@verdaccio/types@11.0.0-6-next.25: - resolution: {integrity: sha512-bkgQjgiYbRfsqn5wElIkWG4Y9wn/f+rfuh/IJ4sfIZ7bMepMPXqHmKbqHEA6PV7jmmtdc8cBaHA5aRHOs6BoYw==} - engines: {node: '>=12'} + /@verdaccio/types@13.0.0-next-8.2: + resolution: {integrity: sha512-I3FmPyRMlE7xjVaeBqZ/9q/+npF18tGe4O7e0yg/qGhx47wRAOJ1+zy0XvxPi5CU8Oe9FXzCqWrl9CH2+m+WgA==} + engines: {node: '>=18'} dev: true /@verdaccio/ui-theme@8.0.0-next-8.7: @@ -3008,23 +3466,13 @@ packages: engines: {node: '>=18'} dependencies: '@verdaccio/core': 8.0.0-next-8.7 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) lodash: 4.17.21 validator: 13.12.0 transitivePeerDependencies: - supports-color dev: true - /@verdaccio/utils@6.0.0-6-next.44: - resolution: {integrity: sha512-fSuxes9lfQO8mBXfV8lAnfeWgM4iUbB4LFv8KgSSd7T3QP453MpS09zZmbJTdxgy8CyWeGvACIQvSXxkYoNxBA==} - engines: {node: '>=12'} - dependencies: - '@verdaccio/core': 6.0.0-6-next.76 - lodash: 4.17.21 - minimatch: 3.1.2 - semver: 7.5.4 - dev: true - /@verdaccio/utils@7.0.1-next-8.1: resolution: {integrity: sha512-cyJdRrVa+8CS7UuIQb3K3IJFjMe64v38tYiBnohSmhRbX7dX9IT3jWbjrwkqWh4KeS1CS6BYENrGG1evJ2ggrQ==} engines: {node: '>=12'} @@ -3045,6 +3493,93 @@ packages: semver: 7.6.3 dev: true + /@vitest/coverage-v8@3.0.4(vitest@3.0.4): + resolution: {integrity: sha512-f0twgRCHgbs24Dp8cLWagzcObXMcuKtAwgxjJV/nnysPAJJk1JiKu/W0gIehZLmkljhJXU/E0/dmuQzsA/4jhA==} + peerDependencies: + '@vitest/browser': 3.0.4 + vitest: 3.0.4 + peerDependenciesMeta: + '@vitest/browser': + optional: true + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 1.0.2 + debug: 4.4.0(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.17 + magicast: 0.3.5 + std-env: 3.8.0 + test-exclude: 7.0.1 + tinyrainbow: 2.0.0 + vitest: 3.0.4(@types/node@20.11.19) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@3.0.4: + resolution: {integrity: sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg==} + dependencies: + '@vitest/spy': 3.0.4 + '@vitest/utils': 3.0.4 + chai: 5.1.2 + tinyrainbow: 2.0.0 + dev: true + + /@vitest/mocker@3.0.4(vite@6.0.11): + resolution: {integrity: sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + dependencies: + '@vitest/spy': 3.0.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + vite: 6.0.11(@types/node@20.11.19) + dev: true + + /@vitest/pretty-format@3.0.4: + resolution: {integrity: sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g==} + dependencies: + tinyrainbow: 2.0.0 + dev: true + + /@vitest/runner@3.0.4: + resolution: {integrity: sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw==} + dependencies: + '@vitest/utils': 3.0.4 + pathe: 2.0.2 + dev: true + + /@vitest/snapshot@3.0.4: + resolution: {integrity: sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w==} + dependencies: + '@vitest/pretty-format': 3.0.4 + magic-string: 0.30.17 + pathe: 2.0.2 + dev: true + + /@vitest/spy@3.0.4: + resolution: {integrity: sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q==} + dependencies: + tinyspy: 3.0.2 + dev: true + + /@vitest/utils@3.0.4: + resolution: {integrity: sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ==} + dependencies: + '@vitest/pretty-format': 3.0.4 + loupe: 3.1.3 + tinyrainbow: 2.0.0 + dev: true + /@vue/compiler-core@3.3.4: resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} dependencies: @@ -3103,14 +3638,14 @@ packages: hasBin: true dev: false - /@yarnpkg/cli-dist@3.8.1: - resolution: {integrity: sha512-+0VUqfgpgkobLgADqMXqQ5IvRTJntgcj9UamFgXuiYNSFZANOdLgZ21AgzH4QNIK1Idj4OGFxyWOPpt0E5VfBQ==} + /@yarnpkg/cli-dist@3.8.3: + resolution: {integrity: sha512-w88oPqVTjfQcUskPehmPGiEJy/QTOb+bUdGBWMFr1HIqW98L2MRUxxi9kJujGKKie+izsoIh6EJktuaD77s9hA==} engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} hasBin: true dev: false - /@yarnpkg/cli-dist@4.1.1: - resolution: {integrity: sha512-5qXVUB1jKY+AHZLjti6gaxxL3Fnog0axt5B6EqTCE5JW/+XL/rz/RqL1fI9T7FVBbaqC7wpvdgqy5t11igZG2Q==} + /@yarnpkg/cli-dist@4.4.0: + resolution: {integrity: sha512-1YMvFokdlHHG+xzB4d7NyzRAnfIZjfnkbY35SK3kU417WRoR9C2IKmW/ePI/WeQ2S9mxOBkETjbluD+A2K0eYg==} engines: {node: '>=18.12.0'} hasBin: true dev: false @@ -3142,7 +3677,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -3190,6 +3725,11 @@ packages: engines: {node: '>=8'} dev: true + /ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + dev: true + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -3209,6 +3749,11 @@ packages: engines: {node: '>=10'} dev: true + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -3283,6 +3828,11 @@ packages: engines: {node: '>=0.8'} dev: true + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + dev: true + /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -3609,6 +4159,11 @@ packages: engines: {node: '>= 0.8'} dev: true + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + /cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -3691,6 +4246,17 @@ packages: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} dev: true + /chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + dev: true + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -3713,6 +4279,11 @@ packages: engines: {node: '>=10'} dev: true + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + dev: true + /check-more-types@2.24.0: resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} engines: {node: '>= 0.8.0'} @@ -3731,7 +4302,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true optional: true @@ -4164,7 +4735,7 @@ packages: ms: 2.1.3 dev: true - /debug@4.4.0: + /debug@4.4.0(supports-color@8.1.1): resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: @@ -4174,6 +4745,7 @@ packages: optional: true dependencies: ms: 2.1.3 + supports-color: 8.1.1 dev: true /decompress-response@6.0.0: @@ -4192,6 +4764,11 @@ packages: optional: true dev: true + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + dev: true + /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -4265,6 +4842,10 @@ packages: stream-shift: 1.0.3 dev: true + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + /ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} dependencies: @@ -4295,6 +4876,10 @@ packages: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -4387,6 +4972,10 @@ packages: engines: {node: '>= 0.4'} dev: true + /es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + dev: true + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} @@ -4405,6 +4994,39 @@ packages: is-symbol: 1.0.4 dev: true + /esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -4434,6 +5056,12 @@ packages: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.6 + dev: true + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -4500,6 +5128,11 @@ packages: engines: {node: '>= 0.8.0'} dev: true + /expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + dev: true + /expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4563,7 +5196,7 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -4695,6 +5328,14 @@ packages: is-callable: 1.2.7 dev: true + /foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + /forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true @@ -4731,6 +5372,15 @@ packages: universalify: 2.0.0 dev: true + /fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} @@ -4749,8 +5399,8 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true @@ -4859,7 +5509,19 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: - is-glob: 4.0.3 + is-glob: 4.0.3 + dev: true + + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 dev: true /glob@6.0.4: @@ -5115,7 +5777,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -5447,6 +6109,11 @@ packages: engines: {node: '>=8'} dev: true + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + /istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} @@ -5468,7 +6135,7 @@ packages: '@babel/parser': 7.23.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 - semver: 7.5.4 + semver: 7.6.3 transitivePeerDependencies: - supports-color dev: true @@ -5482,17 +6149,37 @@ packages: supports-color: 7.2.0 dev: true + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + /istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true + /istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.4.0(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /istanbul-reports@3.1.5: resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} @@ -5501,6 +6188,22 @@ packages: istanbul-lib-report: 3.0.0 dev: true + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + /javascript-natural-sort@0.7.1: resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} dev: true @@ -5687,7 +6390,7 @@ packages: micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /jest-leak-detector@29.7.0: @@ -5866,7 +6569,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.5.4 + semver: 7.6.3 transitivePeerDependencies: - supports-color dev: true @@ -6107,7 +6810,7 @@ packages: colorette: 1.4.0 commander: 8.3.0 cosmiconfig: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) enquirer: 2.3.6 execa: 5.1.1 listr2: 3.14.0(enquirer@2.3.6) @@ -6160,10 +6863,6 @@ packages: signal-exit: 3.0.7 dev: true - /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: true - /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true @@ -6226,6 +6925,10 @@ packages: signal-exit: 3.0.7 dev: true + /loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + dev: true + /lowdb@1.0.0: resolution: {integrity: sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==} engines: {node: '>=4'} @@ -6242,6 +6945,10 @@ packages: engines: {node: '>=8'} dev: true + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + dev: true + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -6267,6 +6974,20 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true + + /magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + dependencies: + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 + source-map-js: 1.2.1 + dev: true + /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -6282,6 +7003,13 @@ packages: semver: 6.3.1 dev: true + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.6.3 + dev: true + /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: @@ -6377,10 +7105,22 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -6415,16 +7155,18 @@ packages: rimraf: 2.4.5 dev: true - /nanoclone@0.2.1: - resolution: {integrity: sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==} - dev: true - /nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true + /nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -6448,17 +7190,6 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /nock@13.5.1: - resolution: {integrity: sha512-+s7b73fzj5KnxbKH4Oaqz07tQ8degcMilU4rrmnKvI//b0JMBU4wEXFQ8zqr+3+L4eWSfU3H/UoIVGUV0tue1Q==} - engines: {node: '>= 10.13'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - json-stringify-safe: 5.0.1 - propagate: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - /node-environment-flags@1.0.6: resolution: {integrity: sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==} dependencies: @@ -6503,8 +7234,8 @@ packages: path-key: 3.1.1 dev: true - /npm@10.1.0: - resolution: {integrity: sha512-pZ2xybXzNGbJFZEKNbPoEXsE38Xou9VTnxxBk+B3pz0ndsGCs7iWHoUCPSsISU2hjmkWfDkJo3bYKE8RDOg4eg==} + /npm@10.9.2: + resolution: {integrity: sha512-iriPEPIkoMYUy3F6f3wwSZAU93E0Eg6cHwIR6jzzOXWSy+SD/rOODEs74cVONHKSx2obXtuUoyidVEhISrisgQ==} engines: {node: ^18.17.0 || >=20.5.0} hasBin: true dev: false @@ -6516,6 +7247,7 @@ packages: - '@npmcli/map-workspaces' - '@npmcli/package-json' - '@npmcli/promise-spawn' + - '@npmcli/redact' - '@npmcli/run-script' - '@sigstore/tuf' - abbrev @@ -6524,8 +7256,6 @@ packages: - chalk - ci-info - cli-columns - - cli-table3 - - columnify - fastest-levenshtein - fs-minipass - glob @@ -6553,6 +7283,7 @@ packages: - ms - node-gyp - nopt + - normalize-package-data - npm-audit-report - npm-install-checks - npm-package-arg @@ -6560,7 +7291,6 @@ packages: - npm-profile - npm-registry-fetch - npm-user-validate - - npmlog - p-map - pacote - parse-conflict-json @@ -6568,6 +7298,7 @@ packages: - qrcode-terminal - read - semver + - spdx-expression-parse - ssri - supports-color - tar @@ -6578,136 +7309,6 @@ packages: - which - write-file-atomic - /npm@6.14.18: - resolution: {integrity: sha512-p3SjqSchSuNQUqbJBgwdv0L3O6bKkaSfQrQzJsskNpNKLg0g37c5xTXFV0SqTlX9GWvoGxBELVJMRWq0J8oaLA==} - engines: {node: 6 >=6.2.0 || 8 || >=9.3.0} - hasBin: true - dev: false - bundledDependencies: - - abbrev - - ansicolors - - ansistyles - - aproba - - archy - - bin-links - - bluebird - - byte-size - - cacache - - call-limit - - chownr - - ci-info - - cli-columns - - cli-table3 - - cmd-shim - - columnify - - config-chain - - debuglog - - detect-indent - - detect-newline - - dezalgo - - editor - - figgy-pudding - - find-npm-prefix - - fs-vacuum - - fs-write-stream-atomic - - gentle-fs - - glob - - graceful-fs - - has-unicode - - hosted-git-info - - iferr - - imurmurhash - - infer-owner - - inflight - - inherits - - ini - - init-package-json - - is-cidr - - json-parse-better-errors - - JSONStream - - lazy-property - - libcipm - - libnpm - - libnpmaccess - - libnpmhook - - libnpmorg - - libnpmsearch - - libnpmteam - - libnpx - - lock-verify - - lockfile - - lodash._baseindexof - - lodash._baseuniq - - lodash._bindcallback - - lodash._cacheindexof - - lodash._createcache - - lodash._getnative - - lodash.clonedeep - - lodash.restparam - - lodash.union - - lodash.uniq - - lodash.without - - lru-cache - - meant - - mississippi - - mkdirp - - move-concurrently - - node-gyp - - nopt - - normalize-package-data - - npm-audit-report - - npm-cache-filename - - npm-install-checks - - npm-lifecycle - - npm-package-arg - - npm-packlist - - npm-pick-manifest - - npm-profile - - npm-registry-fetch - - npm-user-validate - - npmlog - - once - - opener - - osenv - - pacote - - path-is-inside - - promise-inflight - - qrcode-terminal - - query-string - - qw - - read-cmd-shim - - read-installed - - read-package-json - - read-package-tree - - read - - readable-stream - - readdir-scoped-modules - - request - - retry - - rimraf - - safe-buffer - - semver - - sha - - slide - - sorted-object - - sorted-union-stream - - ssri - - stringify-package - - tar - - text-table - - tiny-relative-date - - uid-number - - umask - - unique-filename - - unpipe - - update-notifier - - uuid - - validate-npm-package-license - - validate-npm-package-name - - which - - worker-farm - - write-file-atomic - /npm@7.24.2: resolution: {integrity: sha512-120p116CE8VMMZ+hk8IAb1inCPk4Dj3VZw29/n2g6UI77urJKVYb7FZUDW8hY+EBnfsjI/2yrobBgFyzo7YpVQ==} engines: {node: '>=10'} @@ -6864,8 +7465,8 @@ packages: - which - write-file-atomic - /npm@9.8.1: - resolution: {integrity: sha512-AfDvThQzsIXhYgk9zhbk5R+lh811lKkLAeQMMhSypf1BM7zUafeIIBzMzespeuVEJ0+LvY36oRQYf7IKLzU3rw==} + /npm@9.9.3: + resolution: {integrity: sha512-Z1l+rcQ5kYb17F3hHtO601arEpvdRYnCLtg8xo3AGtyj3IthwaraEOexI9903uANkifFbqHC8hT53KIrozWg8A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true dev: false @@ -6913,6 +7514,7 @@ packages: - ms - node-gyp - nopt + - normalize-package-data - npm-audit-report - npm-install-checks - npm-package-arg @@ -6929,6 +7531,7 @@ packages: - read - semver - sigstore + - spdx-expression-parse - ssri - supports-color - tar @@ -7058,6 +7661,10 @@ packages: engines: {node: '>=6'} dev: true + /package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + dev: true + /pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} dev: true @@ -7113,6 +7720,14 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + dev: true + /path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} dev: true @@ -7122,6 +7737,15 @@ packages: engines: {node: '>=8'} dev: true + /pathe@2.0.2: + resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + dev: true + + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + dev: true + /peek-stream@1.1.3: resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} dependencies: @@ -7142,6 +7766,10 @@ packages: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + dev: true + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -7226,26 +7854,26 @@ packages: semver-compare: 1.0.0 dev: true - /pnpm@6.35.1: - resolution: {integrity: sha512-Pt5JEjV2JSORAqw/XtjfF4k34PBQFpqV3kUMFYSlyrWJsio5Hr3lqy2oJkpprMrVbOyBJsxXfZDQOlvmytIrgA==} - engines: {node: '>=12.17'} + /pnpm@10.0.0-alpha.2: + resolution: {integrity: sha512-8YpZyjYRACMhr3aB5tSSNMs+zoSWsFgYvlsQgRaOwhuMPSjLtDUeL97GbKleZRb6rwi5W3VQE8iM9RdNUCmGXA==} + engines: {node: '>=18.12'} hasBin: true dev: false - /pnpm@7.33.6: - resolution: {integrity: sha512-kOJ/04BH8YWD8zQveEzD8Yf01MqsievB//rhjc17Ld52eKC/I3SBvLj36OZhNfo0gDhW5OssRCzggv+rXZ0kHw==} - engines: {node: '>=14.6'} + /pnpm@8.15.9: + resolution: {integrity: sha512-SZQ0ydj90aJ5Tr9FUrOyXApjOrzuW7Fee13pDzL0e1E6ypjNXP0AHDHw20VLw4BO3M1XhQHkyik6aBYWa72fgQ==} + engines: {node: '>=16.14'} hasBin: true dev: false - /pnpm@8.7.6: - resolution: {integrity: sha512-ZJ/LpDy+IGYpCPYo2INfnw2MopUOTHQ3HcnhbiSqVLtV5rTmsrbFHe4i35ITLpcgvIWptWbzUTZ8efDYXWpFew==} - engines: {node: '>=16.14'} + /pnpm@9.13.2: + resolution: {integrity: sha512-iMnDhkRQNQ5lozWHq4Aaz5RtfIFO0RNNpKkk9t9aISD9NrRqq2j3zR1BMUkRLVPH2zpBNmJM/QD/GEagxs70ig==} + engines: {node: '>=18.12'} hasBin: true dev: false - /pnpm@9.0.6: - resolution: {integrity: sha512-9thjEwlzIHy3ozbWtDmiQqJqyAaAd99TDWqGBpQZhT3B/+ZAKexZSpxQWjpBDRlkPIcKumd2Mw9c/dzxCpwWFw==} + /pnpm@9.15.4: + resolution: {integrity: sha512-stwg4vxys+GISEWbNzWaMgZGY+VielHkx0ssKd2OjgSRSDw6u0B4nP1Xi/Ni+2uoJhsF8Dh9dnku1uI+o7G2oA==} engines: {node: '>=18.12'} hasBin: true dev: false @@ -7259,6 +7887,15 @@ packages: source-map-js: 1.0.2 dev: true + /postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + dev: true + /prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -7313,15 +7950,6 @@ packages: sisteransi: 1.0.5 dev: true - /propagate@2.0.1: - resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} - engines: {node: '>= 8'} - dev: true - - /property-expr@2.0.5: - resolution: {integrity: sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==} - dev: true - /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -7602,6 +8230,35 @@ packages: glob: 7.2.3 dev: true + /rollup@4.34.0: + resolution: {integrity: sha512-+4C/cgJ9w6sudisA0nZz0+O7lTP9a3CzNLsoDwaRumM8QHwghUsu6tqHXiTmNUp/rqNiM14++7dkzHDyCRs0Jg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.0 + '@rollup/rollup-android-arm64': 4.34.0 + '@rollup/rollup-darwin-arm64': 4.34.0 + '@rollup/rollup-darwin-x64': 4.34.0 + '@rollup/rollup-freebsd-arm64': 4.34.0 + '@rollup/rollup-freebsd-x64': 4.34.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.0 + '@rollup/rollup-linux-arm-musleabihf': 4.34.0 + '@rollup/rollup-linux-arm64-gnu': 4.34.0 + '@rollup/rollup-linux-arm64-musl': 4.34.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.0 + '@rollup/rollup-linux-riscv64-gnu': 4.34.0 + '@rollup/rollup-linux-s390x-gnu': 4.34.0 + '@rollup/rollup-linux-x64-gnu': 4.34.0 + '@rollup/rollup-linux-x64-musl': 4.34.0 + '@rollup/rollup-win32-arm64-msvc': 4.34.0 + '@rollup/rollup-win32-ia32-msvc': 4.34.0 + '@rollup/rollup-win32-x64-msvc': 4.34.0 + fsevents: 2.3.3 + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -7763,10 +8420,19 @@ packages: object-inspect: 1.13.2 dev: true + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true @@ -7816,6 +8482,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + dev: true + /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: @@ -7872,11 +8543,19 @@ packages: escape-string-regexp: 2.0.0 dev: true + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} dev: true + /std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + dev: true + /steno@0.4.4: resolution: {integrity: sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==} dependencies: @@ -7919,6 +8598,15 @@ packages: strip-ansi: 6.0.1 dev: true + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + /string.prototype.trim@1.2.7: resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} engines: {node: '>= 0.4'} @@ -7972,6 +8660,13 @@ packages: ansi-regex: 5.0.1 dev: true + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.1.0 + dev: true + /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} @@ -8030,6 +8725,15 @@ packages: minimatch: 3.1.2 dev: true + /test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + dev: true + /text-decoder@1.1.1: resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} dependencies: @@ -8057,6 +8761,29 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true + /tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + dev: true + + /tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + dev: true + + /tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + dev: true + + /tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + dev: true + /tmp@0.2.1: resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} engines: {node: '>=8.17.0'} @@ -8086,10 +8813,6 @@ packages: engines: {node: '>=0.6'} dev: true - /toposort@2.0.2: - resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} - dev: true - /tough-cookie@2.5.0: resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} engines: {node: '>=0.8'} @@ -8322,7 +9045,7 @@ packages: apache-md5: 1.1.8 bcryptjs: 2.4.3 core-js: 3.37.1 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) http-errors: 2.0.0 unix-crypt-td-js: 1.1.4 transitivePeerDependencies: @@ -8356,7 +9079,7 @@ packages: clipanion: 3.2.1(typanion@3.13.0) compression: 1.7.5 cors: 2.8.5 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) envinfo: 7.13.0 express: 4.21.2 express-rate-limit: 5.5.1 @@ -8389,6 +9112,143 @@ packages: extsprintf: 1.3.0 dev: true + /vite-node@3.0.4(@types/node@20.11.19): + resolution: {integrity: sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.4.0(supports-color@8.1.1) + es-module-lexer: 1.6.0 + pathe: 2.0.2 + vite: 6.0.11(@types/node@20.11.19) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + dev: true + + /vite@6.0.11(@types/node@20.11.19): + resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + dependencies: + '@types/node': 20.11.19 + esbuild: 0.24.2 + postcss: 8.5.1 + rollup: 4.34.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@3.0.4(@types/node@20.11.19): + resolution: {integrity: sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.0.4 + '@vitest/ui': 3.0.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/node': 20.11.19 + '@vitest/expect': 3.0.4 + '@vitest/mocker': 3.0.4(vite@6.0.11) + '@vitest/pretty-format': 3.0.4 + '@vitest/runner': 3.0.4 + '@vitest/snapshot': 3.0.4 + '@vitest/spy': 3.0.4 + '@vitest/utils': 3.0.4 + chai: 5.1.2 + debug: 4.4.0(supports-color@8.1.1) + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 2.0.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.0.11(@types/node@20.11.19) + vite-node: 3.0.4(@types/node@20.11.19) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + dev: true + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -8436,6 +9296,15 @@ packages: isexe: 2.0.0 dev: true + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + /wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true @@ -8458,6 +9327,15 @@ packages: strip-ansi: 6.0.1 dev: true + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true @@ -8493,11 +9371,6 @@ packages: engines: {node: '>= 6'} dev: true - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: true - /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -8516,8 +9389,8 @@ packages: yargs-parser: 21.1.1 dev: true - /yarn@1.22.21: - resolution: {integrity: sha512-ynXaJsADJ9JiZ84zU25XkPGOvVMmZ5b7tmTSpKURYwgELdjucAOydqIOrOfTxVYcNXe91xvLZwcRh68SR3liCg==} + /yarn@1.22.22: + resolution: {integrity: sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==} engines: {node: '>=4.0.0'} hasBin: true requiresBuild: true @@ -8534,16 +9407,3 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true - - /yup@0.32.11: - resolution: {integrity: sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==} - engines: {node: '>=10'} - dependencies: - '@babel/runtime': 7.23.9 - '@types/lodash': 4.14.202 - lodash: 4.17.21 - lodash-es: 4.17.21 - nanoclone: 0.2.1 - property-expr: 2.0.5 - toposort: 2.0.2 - dev: true diff --git a/tools/cli-commons/package.json b/tools/cli-commons/package.json index dd40fea..6527188 100644 --- a/tools/cli-commons/package.json +++ b/tools/cli-commons/package.json @@ -1,22 +1,20 @@ { "private": true, "name": "@verdaccio/test-cli-commons", - "version": "1.0.1-6-next.5", + "version": "2.0.0", "main": "./build/index.js", "types": "./build/index.d.ts", "devDependencies": { - "@verdaccio/config": "latest", - "@verdaccio/core": "latest", - "@verdaccio/types": "6-next", - "@verdaccio/utils": "latest", - "debug": "4.3.4", - "fs-extra": "10.1.0", + "@verdaccio/config": "next-8", + "@verdaccio/core": "next-8", + "@verdaccio/types": "next-8", + "@verdaccio/utils": "next-8", + "debug": "4.4.0", + "fs-extra": "11.2.0", "get-port": "5.1.1", "got": "11.8.6", - "lodash": "4.17.21", - "nock": "13.5.1", - "verdaccio": "7.0.0-d146790.0", - "yaml": "2.3.4" + "js-yaml": "4.1.0", + "lodash": "4.17.21", "verdaccio": "7.0.0-d146790.0" }, "scripts": { "test": "jest", diff --git a/tools/cli-commons/src/index.ts b/tools/cli-commons/src/index.ts index 55f85cb..bfb9138 100644 --- a/tools/cli-commons/src/index.ts +++ b/tools/cli-commons/src/index.ts @@ -1,5 +1,6 @@ export { getDefaultConfig, ConfigBuilder } from '@verdaccio/config'; export { constants } from '@verdaccio/core'; +export { Registry } from 'verdaccio'; export { initialSetup, getConfigPath, Setup } from './registry'; export { addNpmPrefix, diff --git a/tools/cli-commons/src/npm-utils.ts b/tools/cli-commons/src/npm-utils.ts index 20a2356..aa591e4 100644 --- a/tools/cli-commons/src/npm-utils.ts +++ b/tools/cli-commons/src/npm-utils.ts @@ -1,22 +1,31 @@ +import buildDebug from 'debug'; + import { addRegistry } from './utils'; +const debug = buildDebug('verdaccio:e2e:npm-utils'); export async function bumbUp(cmd, tempFolder, registry) { await cmd({ cwd: tempFolder }, 'version', 'minor', ...addRegistry(registry.getRegistryUrl())); } -export async function publish(cmd, tempFolder, pkgName, registry, arg: string[] = []) { - const resp = await cmd( +export async function bumpUpPackage(cmd, tempFolder, pkgName, registry, arg: string[] = []) { + debug('bump up package %o', pkgName); + await cmd( { cwd: tempFolder }, - 'publish', + 'version', ...arg, - '--json', + '--no--git-tag-version', + '--loglevel=info', ...addRegistry(registry.getRegistryUrl()) ); - const parsedBody = JSON.parse(resp.stdout as string); - expect(parsedBody.name).toEqual(pkgName); +} + +export async function publish(cmd, tempFolder, pkgName, registry, arg: string[] = []) { + debug('publishing %o', pkgName); + await cmd({ cwd: tempFolder }, 'publish', ...arg, ...addRegistry(registry.getRegistryUrl())); } export async function getInfoVersions(cmd, pkgName, registry) { + debug('getting info %o', pkgName); const infoResp = await cmd( {}, 'info', @@ -25,5 +34,6 @@ export async function getInfoVersions(cmd, pkgName, registry) { ...addRegistry(registry.getRegistryUrl()) ); const infoBody = JSON.parse(infoResp.stdout as string); + debug('info %o', infoBody); return infoBody; } diff --git a/tools/cli-commons/src/process.ts b/tools/cli-commons/src/process.ts index 9b8763b..44375a6 100644 --- a/tools/cli-commons/src/process.ts +++ b/tools/cli-commons/src/process.ts @@ -4,6 +4,7 @@ import buildDebug from 'debug'; import { createInterface } from 'readline'; const debug = buildDebug('verdaccio:e2e:process'); +const debugRead = buildDebug('verdaccio:e2e:line'); export type ExecOutput = { stdout: string; @@ -11,7 +12,7 @@ export type ExecOutput = { }; export async function exec(options: SpawnOptions, cmd, args): Promise { - debug('start _exec %o %o %o', options, cmd, args); + debug('start _exec %o %o %o', options, cmd, args ? args.join(' ') : ''); let stdout = ''; let stderr; const env = options.env; @@ -31,28 +32,33 @@ export async function exec(options: SpawnOptions, cmd, args): Promise { + debugRead('data %o', data.toString()); + }); + const rl = createInterface({ + input: childProcess.stdout, + output: process.stdout, + terminal: false, + }); - rl.on('line', function (line) { - stdout += line; - }); + rl.on('line', function (line) { + debugRead('line %o', line); + stdout += line; + }); + } const err = new Error(`Running "${cmd} ${args.join(' ')}" returned error code `); return new Promise((resolve, reject) => { childProcess.on('exit', (error) => { + debugRead('exit %o', error); if (!error) { resolve({ stdout, stderr }); } else { err.message += `${error}...\n\nSTDOUT:\n${stdout}\n\nSTDERR:\n${stderr}\n`; - return reject({ stdout, stderr: err }); + const errorObj = { stdout, stderr: err }; + return reject(errorObj); } }); }); } - -export function silentNpm(...args): Promise { - debug('run silent npm %o', args); - // @ts-ignore - return exec({ silent: true }, 'npm', args); -} diff --git a/tools/cli-commons/src/registry.ts b/tools/cli-commons/src/registry.ts index 6b9bf4c..4791000 100644 --- a/tools/cli-commons/src/registry.ts +++ b/tools/cli-commons/src/registry.ts @@ -1,12 +1,12 @@ /* eslint-disable prefer-promise-reject-errors */ import buildDebug from 'debug'; +import getPort from 'get-port'; import { merge } from 'lodash'; +import { Registry } from './server'; import { getDefaultConfig } from '@verdaccio/config'; import { ConfigYaml } from '@verdaccio/types'; -import { Registry } from './server'; - const debug = buildDebug('verdaccio:e2e:registry-utils'); export type Setup = { @@ -17,7 +17,7 @@ export type Setup = { const log = process.env.NODE_ENV === 'production' ? { type: 'stdout', format: 'json', level: 'warn' } - : { type: 'stdout', format: 'pretty', level: 'info' }; + : { type: 'stdout', format: 'pretty', level: 'debug' }; const defaultConfig = { ...getDefaultConfig(), @@ -36,6 +36,7 @@ export async function initialSetup(customConfig?: ConfigYaml): Promise { const { configPath, tempFolder } = await getConfigPath(config); debug(`configPath %o`, configPath); debug(`tempFolder %o`, tempFolder); - const registry = new Registry(configPath, { createUser: true }); + const port = await getPort(); + const registry = new Registry(configPath, { createUser: true, port }); return { registry, tempFolder }; } diff --git a/tools/cli-commons/src/utils.ts b/tools/cli-commons/src/utils.ts index 22d1eb8..0a697b9 100644 --- a/tools/cli-commons/src/utils.ts +++ b/tools/cli-commons/src/utils.ts @@ -1,11 +1,13 @@ +import buildDebug from 'debug'; import fs from 'fs-extra'; import { cp, readFile, writeFile } from 'fs/promises'; import { join } from 'path'; import { fileUtils } from '@verdaccio/core'; +const debug = buildDebug('verdaccio:e2e:utils'); + export function createProject(projectName: string) { - // @ts-ignore const tempRootFolder = global.__namespace.getItem('dir-suite-root'); const verdaccioInstall = join(tempRootFolder, projectName); fs.mkdirSync(verdaccioInstall); @@ -14,12 +16,14 @@ export function createProject(projectName: string) { } export function copyConfigFile(rootFolder, configTemplate): string { const configPath = join(rootFolder, 'config.yaml'); + debug('copying config file %o', configPath); copyTo(join(__dirname, configTemplate), configPath); return configPath; } export async function createTempFolder(prefix: string) { + debug('creating temp folder %o', prefix); return fileUtils.createTempFolder(prefix); } @@ -32,10 +36,12 @@ export function cleanUpTemp(tmpFolder) { } export function addRegistry(registryUrl) { + debug('adding registry %o', registryUrl); return ['--registry', registryUrl]; } export function addNpmPrefix(installFolder) { + debug('adding prefix %o', installFolder); return ['--prefix', installFolder]; } @@ -51,6 +57,7 @@ export async function prepareYarnModernProject( registryDomain: string, yarnPath: string ) { + debug('preparing yarn project %o', projectName); const tempFolder = await createTempFolder(projectName); // FUTURE: native copy folder instead fs-extra fs.copySync(templatePath, tempFolder); @@ -68,6 +75,7 @@ export const getPackageJSON = ( dependencies = {}, devDependencies = {} ) => { + debug('creating package.json %o', packageName); const json = { name: packageName, version, @@ -104,6 +112,7 @@ export async function prepareGenericEmptyProject( dependencies: any = {}, devDependencies: any = {} ) { + debug('preparing generic project %o', packageName); const getNPMrc = (port, token, registry) => `//localhost:${port}/:_authToken=${token} registry=${registry}`; const tempFolder = await createTempFolder('temp-folder'); diff --git a/tools/cli-commons/src/yarn-modern-utils.ts b/tools/cli-commons/src/yarn-modern-utils.ts index a7b2d65..c8dc4a1 100644 --- a/tools/cli-commons/src/yarn-modern-utils.ts +++ b/tools/cli-commons/src/yarn-modern-utils.ts @@ -1,16 +1,12 @@ -import fs from 'fs'; -import { copySync } from 'fs-extra'; +import { cp, writeFile } from 'fs/promises'; +import YAML from 'js-yaml'; import { join } from 'path'; import { URL } from 'url'; -import YAML from 'yaml'; import { Dependencies } from '@verdaccio/types'; import { createTempFolder, getPackageJSON, getREADME } from './utils'; -const fsp = fs.promises ? fs.promises : require('fs/promises'); -const { writeFile, copyFile } = fsp; - export function createYamlConfig(registry: string, token?: string) { const defaultYaml: any = { npmRegistryServer: registry, @@ -29,7 +25,7 @@ export function createYamlConfig(registry: string, token?: string) { }; } - return YAML.stringify(defaultYaml); + return YAML.dump(defaultYaml); } export async function prepareYarnModernProject( @@ -53,6 +49,6 @@ export async function prepareYarnModernProject( getPackageJSON(packageName, version, dependencies, devDependencies) ); await writeFile(join(tempFolder, 'README.md'), getREADME(packageName)); - copySync(yarnBinPath, join(tempFolder, '.yarn/releases/yarn.js')); + await cp(yarnBinPath, join(tempFolder, '.yarn/releases/yarn.js'), { dereference: true }); return { tempFolder }; }