Compare commits

...

300 Commits

Author SHA1 Message Date
Juan Picado
dd952ec055 chore: update versions (next-7) (#4474)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-02-11 23:16:30 +01:00
Marc Bernard
3323599268 fix: render READMEs with correct font and highlighting (#4494) 2024-02-11 18:05:48 +01:00
Juan Picado
d4d137f664 chore: add pqina as sponsor website 2024-02-11 17:44:31 +01:00
Juan Picado
ec9647b6ce Update package.spec.ts 2024-02-11 17:08:45 +01:00
Juan Picado
b8618e6e97 chore: flaky test proxy error handler 2024-02-11 16:58:41 +01:00
Juan Picado
50eb7b2ca4 chore: flaky test local storage (#4497)
* chore: flaky test local storage

* fix test
2024-02-11 16:30:26 +01:00
Juan Picado
6bae1c0739 chore: fix flaky test 2024-02-11 15:31:59 +01:00
verdacciobot
817075685b chore: updated static data 2024-02-08 00:12:10 +00:00
dependabot[bot]
e5f924c19c chore(deps): bump github/codeql-action from 3.23.2 to 3.24.0 (#4492)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.23.2 to 3.24.0.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](b7bf0a3ed3...e8893c57a1)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-05 21:46:37 +01:00
dependabot[bot]
3ed2104471 chore(deps): bump treosh/lighthouse-ci-action from 10.1.0 to 11.4.0 (#4491)
Bumps [treosh/lighthouse-ci-action](https://github.com/treosh/lighthouse-ci-action) from 10.1.0 to 11.4.0.
- [Release notes](https://github.com/treosh/lighthouse-ci-action/releases)
- [Commits](03becbfc54...1b0e7c3327)

---
updated-dependencies:
- dependency-name: treosh/lighthouse-ci-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-05 21:46:29 +01:00
verdacciobot
0f3a4da825 chore: updated static data 2024-02-05 00:13:35 +00:00
renovate[bot]
b638695bd8 chore(deps): update marocchino/sticky-pull-request-comment digest to 331f8f5 (#4488)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-03 10:10:43 +01:00
renovate[bot]
71d5326930 chore(deps): replace dependency npm-run-all with npm-run-all2 5.0.0 (#4487)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-03 10:10:29 +01:00
verdacciobot
8755f01a97 chore: updated static data 2024-02-01 00:13:14 +00:00
renovate[bot]
d540bc6647 chore(deps): update all test dependencies (#4481)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-29 21:35:48 +01:00
renovate[bot]
2c29445faf chore(deps): update babel monorepo to v7.23.9 (#4477)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-29 21:35:35 +01:00
Juan Picado
119df261cc Update renovate.json 2024-01-29 21:34:48 +01:00
Juan Picado
2c66d49da7 Update renovate.json 2024-01-29 21:30:52 +01:00
Juan Picado
8b3563d151 Update renovate.json 2024-01-29 21:29:43 +01:00
dependabot[bot]
e83af641ba chore(deps): bump github/codeql-action from 2.23.2 to 3.23.2 (#4483) 2024-01-29 17:41:36 +01:00
verdacciobot
b7ee3c4096 chore: updated static data 2024-01-29 00:12:40 +00:00
renovate[bot]
575facc5c3 chore(deps): update dependency webpack to v5.90.0 (#4482)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-27 13:45:34 +01:00
Juan Picado
f22dca8d32 Update renovate.json 2024-01-27 13:09:35 +01:00
renovate[bot]
2453be40b4 chore(deps): update github/codeql-action digest to 2f93e43 (#4475)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-27 12:42:56 +01:00
renovate[bot]
735814dfdc chore(deps): update typescript dependencies (#4478)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-27 12:42:44 +01:00
renovate[bot]
15e0417878 fix(deps): update material-ui monorepo to v5.15.6 (#4479)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-27 12:42:36 +01:00
verdacciobot
7bc60b7177 chore: updated static data 2024-01-25 00:13:14 +00:00
Juan Picado
74cd588828 fix: bug on change password npm profile (#4473)
* fix: bug on change password npm profile

* add new case
2024-01-24 23:14:38 +01:00
renovate[bot]
8380b8e980 fix(deps): update all test dependencies (#4443)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-23 09:04:35 +01:00
dependabot[bot]
2afac3cb80 chore(deps): bump github/codeql-action from 2.23.1 to 3.23.1 (#4470)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.23.1 to 3.23.1.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](4759df8df7...0b21cf2492)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-22 19:05:01 +01:00
Juan Picado
c366af5370 Update ui-components.yml 2024-01-22 08:11:54 +01:00
verdacciobot
3fdff8321b chore: updated static data 2024-01-22 00:13:41 +00:00
renovate[bot]
b06e8f584f chore(deps): update actions/upload-artifact digest to a8a3f3a (#4466) 2024-01-21 12:54:42 +01:00
renovate[bot]
0f7271cddf chore(deps): update dependency sass to v1.70.0 (#4462)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-21 09:09:41 +01:00
dependabot[bot]
20cbf5b3bd chore(deps): bump actions/upload-artifact from 3.1.3 to 4.1.0 (#4441)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3.1.3 to 4.1.0.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](a8a3f3ad30...1eb3cb2b3e)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-21 09:07:15 +01:00
renovate[bot]
d45bf93501 chore(deps): update github/codeql-action digest to 4759df8 (#4460)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-20 16:40:25 +01:00
renovate[bot]
7f0161370b fix(deps): update material-ui monorepo to v5.15.5 (#4461) 2024-01-20 15:46:38 +01:00
dependabot[bot]
f1ca952b8b chore(deps): bump github/codeql-action from 2.23.1 to 3.23.1 (#4459)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.23.1 to 3.23.1.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](4759df8df7...0b21cf2492)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-20 15:04:27 +01:00
Juan Picado
b6150b63aa Update renovate.json 2024-01-20 14:27:34 +01:00
renovate[bot]
5f83b328a2 chore(deps): update dependency css-loader to v6.9.1 (#4458)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-20 14:14:03 +01:00
renovate[bot]
11e71ce8d9 chore(deps): update github/codeql-action digest to 4759df8 (#4451)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-20 14:12:34 +01:00
renovate[bot]
3685a982cd fix(deps): update dependency js-base64 to v3.7.6 (#4456)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-20 14:12:16 +01:00
renovate[bot]
1f936defc7 fix(deps): update dependency usehooks-ts to v2.9.5 (#4457)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-20 14:12:06 +01:00
Juan Picado
fcc1ca51ae Update renovate.json 2024-01-20 14:03:04 +01:00
renovate[bot]
2acf0d4cbb chore(deps): update typescript dependencies (master) (#4442)
* chore(deps): update typescript dependencies

* Update proxy.ts

* Update request.ts

* Update local-fs.test.ts

* Update renovate.json

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Juan Picado <juanpicado19@gmail.com>
2024-01-20 13:59:24 +01:00
renovate[bot]
3d368fc456 chore(deps): update dependency nodemon to v3.0.3 (#4454)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-20 13:09:30 +01:00
renovate[bot]
a21dbc7447 chore(deps): update dependency @crowdin/cli to v3.16.1 (#4452)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-20 12:38:23 +01:00
verdacciobot
f9982c5fda chore: updated static data 2024-01-18 00:12:50 +00:00
Juan Picado
cea53128d8 Update renovate.json 2024-01-15 07:25:55 +01:00
Juan Picado
f599e24668 Update renovate.json 2024-01-15 07:21:06 +01:00
verdacciobot
6d6f4d7833 chore: updated static data 2024-01-15 00:13:49 +00:00
renovate[bot]
5baf74bbf7 chore(deps): update dependency nock to v13.5.0 (#4429)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-14 20:48:20 +01:00
Juan Picado
4fc7fc6bcb update doc 2024-01-14 20:35:17 +01:00
renovate[bot]
1b8b74c364 fix(deps): update dependency sonic-boom to v3.8.0 (#4393)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-14 20:29:09 +01:00
renovate[bot]
c7fba8f8bb fix(deps): update material-ui monorepo to v5.15.4 (master) (#4419)
* fix(deps): update material-ui monorepo to v5.15.4

* remove snapshots

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Juan Picado <juanpicado19@gmail.com>
2024-01-14 20:24:33 +01:00
renovate[bot]
a919c26da5 chore(deps): update dependency supertest to v6.3.4 (#4425)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-14 18:05:50 +01:00
renovate[bot]
61eff4c007 fix(deps): update dependency npm to v10.3.0 (#4421)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-14 17:50:53 +01:00
renovate[bot]
269ff273e5 chore(deps): update actions/cache digest to e12d46a (#4406)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-14 13:10:27 +01:00
renovate[bot]
ff7761ddf1 chore(deps): update babel monorepo to v7.23.8 (#4400)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-14 13:10:15 +01:00
renovate[bot]
874cdd0249 chore(deps): update dependency css-loader to v6.9.0 (#4420)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-14 12:56:25 +01:00
renovate[bot]
0aa7cf5c63 chore(deps): update dependency @testing-library/dom to v9.3.4 (master) (#4401)
* chore(deps): update dependency @testing-library/dom to v9.3.4

* Update htpasswd.test.ts

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Juan Picado <juanpicado19@gmail.com>
2024-01-14 12:56:15 +01:00
renovate[bot]
6feb2a8b1d fix(deps): update dependency @crowdin/crowdin-api-client to v1.29.5 (#4414)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-14 12:41:24 +01:00
renovate[bot]
cb3ebe575f fix(deps): update dependency usehooks-ts to v2.9.4 (#4416)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-14 12:36:48 +01:00
Juan Picado
beb9ca2eea Update ui-components.yml 2024-01-14 12:25:35 +01:00
Juan Picado
282f9ce2b0 Update ui-components.yml 2024-01-14 12:24:42 +01:00
Juan Picado
4782bdd5e3 chore: update versions (next-7) (#4417)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-01-14 10:56:23 +01:00
Juan Picado
07a8dd3cd2 changeset release 2024-01-14 10:22:21 +01:00
Juan Picado
4f70a46585 changeset release 2024-01-14 10:20:39 +01:00
Juan Picado
172691ef1d update changeet 2024-01-14 10:17:05 +01:00
renovate[bot]
2dbfde9b7d fix(deps): update dependency react-hook-form to v7.49.3 (#4415)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-14 09:53:06 +01:00
renovate[bot]
44017ff2da chore(deps): update dependency style-loader to v3.3.4 (#4412)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-14 09:31:07 +01:00
renovate[bot]
6faecee7e6 fix(deps): update all linting dependencies (#4413)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-14 09:30:55 +01:00
renovate[bot]
3d94001b49 chore(deps): update dependency @types/validator to v13.11.8 (#4410) 2024-01-13 17:39:52 +01:00
renovate[bot]
5351356cb7 chore(deps): update dependency mini-css-extract-plugin to v2.7.7 (#4411) 2024-01-13 17:35:28 +01:00
renovate[bot]
bf6343e3c7 fix(deps): update dependency usehooks-ts to v2.9.3 (#4395) 2024-01-13 17:11:11 +01:00
renovate[bot]
8ab1cf1bc0 chore(deps): update all linting dependencies (#4405)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-11 21:45:22 +01:00
renovate[bot]
e63722a7a6 chore(deps): update dependency @types/node to v20.11.0 (#4391)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-11 13:23:44 +01:00
verdacciobot
6c1d2fca6a chore: updated static data 2024-01-11 00:12:50 +00:00
renovate[bot]
c65f9fefc2 chore(deps): update github/codeql-action digest to 8b7fcbf (#4399)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-08 22:39:38 +01:00
verdacciobot
66f9a17189 chore: updated static data 2024-01-08 00:13:14 +00:00
Juan Picado
49a1fc11c2 docs: update website 6.x 2024-01-07 11:44:42 +01:00
Juan Picado
d575eb9356 chore: update versions (next) (#4384) 2024-01-07 10:02:08 +01:00
renovate[bot]
a7745bf9df fix(deps): update material-ui monorepo to v5.15.3 (master) (#4376)
* fix(deps): update material-ui monorepo to v5.15.3

* chore: update snapshots

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Juan Picado <juanpicado19@gmail.com>
2024-01-06 19:51:59 +01:00
renovate[bot]
f1d219e48c chore(deps): update all linting dependencies to v6.18.0 (#4385) 2024-01-06 17:45:04 +01:00
Juan Picado
bdd55eacf9 chore: update pnpm (#4387) 2024-01-06 16:51:21 +01:00
renovate[bot]
22d9802be0 chore(deps): update dependency @types/react to v18.2.47 (#4383) 2024-01-06 13:25:20 +01:00
Marc Bernard
e14b064a38 chore(store): fix polynominal regex codeql (#4332) 2024-01-06 13:25:07 +01:00
renovate[bot]
1c5106ec6f fix(deps): update dependency dompurify to v3.0.8 (#4381)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-06 11:32:08 +01:00
Marc Bernard
4d9632424d chore(config): increase test coverage (#4382)
* chore(config): increase test coverage

* adjust length (32 bytes in hex)
2024-01-06 11:31:32 +01:00
renovate[bot]
e1efd79b60 fix(deps): update dependency @crowdin/crowdin-api-client to v1.29.3 (#4380) 2024-01-05 13:08:42 +01:00
renovate[bot]
54260206f3 chore(deps): update dependency @crowdin/cli to v3.16.0 (#4379)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-05 10:37:28 +01:00
renovate[bot]
851950a0fc fix(deps): update dependency dompurify to v3.0.7 (#4378) 2024-01-04 20:19:43 +01:00
renovate[bot]
ddd74ef0fc fix(deps): update dependency @crowdin/crowdin-api-client to v1.29.2 (#4373)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-04 07:10:14 +01:00
renovate[bot]
968b59962c chore(deps): update dependency @testing-library/jest-dom to v6.2.0 (#4377)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-03 23:41:53 +01:00
renovate[bot]
36cdc5c091 chore(deps): update dependency node-mocks-http to v1.14.1 (#4375) 2024-01-03 18:30:21 +01:00
renovate[bot]
869576ae57 chore(deps): update dependency sass to v1.69.7 (#4374)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-03 09:22:11 +01:00
renovate[bot]
d32ce71866 fix(deps): update dependency @crowdin/crowdin-api-client to v1.29.0 (#4372)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-02 12:59:41 +01:00
renovate[bot]
16cb6348c9 chore(deps): update all linting dependencies (#4365)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-02 09:17:55 +01:00
renovate[bot]
f5b9d20859 chore(deps): update actions/upload-artifact digest to a8a3f3a (#4363)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-01 16:40:35 +01:00
dependabot[bot]
ba7c7577c7 chore(deps): bump actions/upload-artifact from 3.1.3 to 4.0.0 (#4360) 2024-01-01 14:04:57 +01:00
dependabot[bot]
fcfa14fa9b chore(deps): bump actions/setup-node from 3.8.2 to 4.0.1 (#4362) 2024-01-01 14:04:30 +01:00
verdacciobot
224ddd91d7 chore: updated static data 2024-01-01 00:14:26 +00:00
Juan Picado
297ae86677 Update renovate.json 2023-12-31 16:40:49 +01:00
Juan Picado
11a1276281 Update LICENSE 2023-12-31 16:35:43 +01:00
Juan Picado
a347c3e934 Update renovate.json 2023-12-31 16:35:40 +01:00
Juan Picado
6dba80e3cb Update renovate.json 2023-12-31 16:22:46 +01:00
Juan Picado
9e6acdbdcc Update ui-components.yml 2023-12-31 16:15:02 +01:00
Juan Picado
3a0eab511f update ci settings 2023-12-31 16:12:25 +01:00
Juan Picado
5bec47859c Update renovate.json 2023-12-31 16:11:00 +01:00
Juan Picado
2673bccdd8 Update renovate.json 2023-12-31 16:08:17 +01:00
Juan Picado
0b5bd2ba92 update ci settings 2023-12-31 15:22:27 +01:00
Juan Picado
37825bfe77 chore: update versions (next) (#4351)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-12-31 14:54:02 +01:00
Juan Picado
f047cc8c25 refactor: auth with legacy sign support (#4113)
* refactor: auth with legacy sign support

refactor: auth with legacy sign support

add tests

add tests

clean up lock fil

clean up lock fil

add more ci to test

update ci

update ci

update ci

update ci

update ci

* chore: add test for deprecated legacy signature

* chore: add test for deprecated legacy signature

* chore: add test for deprecated legacy signature

* chore: add test for deprecated legacy signature

* chore: add test for deprecated legacy signature
2023-12-31 14:34:29 +01:00
renovate[bot]
5f8e361262 fix(deps): update dependency marked to v11.1.1 (#4349)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-31 08:21:39 +01:00
renovate[bot]
b537d0d5dd chore(deps): update dependency @types/node to v20.10.6 (#4346)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-30 11:46:59 +01:00
renovate[bot]
56442b8d03 chore(deps): update babel monorepo to v7.23.7 (#4343)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-30 09:40:14 +01:00
renovate[bot]
34ae4ef638 fix(deps): update dependency classnames to v2.5.1 (#4340) 2023-12-29 19:10:26 +01:00
renovate[bot]
ed5d78e0fe fix(deps): update dependency core-js to v3.35.0 (#4338) 2023-12-29 18:16:26 +01:00
renovate[bot]
922b37f200 chore(deps): update dependency sass to v1.69.6 (#4337) 2023-12-29 18:16:15 +01:00
renovate[bot]
c8c40a2cf5 fix(deps): update dependency cookies to v0.9.0 (#4339) 2023-12-29 18:15:56 +01:00
renovate[bot]
0d1205c951 chore(deps): update dependency @types/react to v18.2.46 (#4335)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-28 19:33:11 +01:00
renovate[bot]
2e711dabaf chore(deps): update dependency terser-webpack-plugin to v5.3.10 (#4336) 2023-12-28 18:43:31 +01:00
renovate[bot]
806bcdf46e chore(deps): update dependency @types/node-fetch to v2.6.10 (#4333) 2023-12-28 14:16:55 +01:00
renovate[bot]
f2959a370b fix(deps): update dependency classnames to v2.5.0 (#4330)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-28 11:42:11 +01:00
renovate[bot]
419eb8861b chore(deps): update actions/upload-artifact digest to a8a3f3a (#4329)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-28 11:41:52 +01:00
verdacciobot
6652bbacb3 chore: updated static data 2023-12-28 00:12:47 +00:00
renovate[bot]
e3b82ae391 chore(deps): update github/codeql-action digest to 1500a13 (#4319) 2023-12-27 18:15:02 +01:00
renovate[bot]
a9491acbde chore(deps): update dependency @testing-library/jest-dom to v6.1.6 (#4328) 2023-12-27 18:14:52 +01:00
renovate[bot]
7680323d2d chore(deps): update dependency fastify to v4.25.2 (#4324) 2023-12-27 18:14:43 +01:00
dependabot[bot]
7fb1714cb3 chore(deps): bump actions/upload-artifact from 3.1.3 to 4.0.0 (#4325)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3.1.3 to 4.0.0.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](a8a3f3ad30...c7d193f32e)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-27 16:08:09 +01:00
dependabot[bot]
898abdc714 chore(deps): bump github/codeql-action from 2.22.11 to 3.22.12 (#4326)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.22.11 to 3.22.12.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](03e7845b7b...012739e508)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-27 16:07:59 +01:00
renovate[bot]
c38a321168 fix(deps): update dependency pino to v8.17.2 (#4327)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-27 16:07:51 +01:00
renovate[bot]
d8097b8030 chore(deps): update all linting dependencies (master) (#4322) 2023-12-27 15:07:36 +01:00
verdacciobot
a7e0dbb753 chore: updated static data 2023-12-25 00:13:21 +00:00
Marc Bernard
0f3df248f8 chore(website): addons update codeql (#4321) 2023-12-24 20:45:09 +01:00
Juan Picado
7b579b3337 Update netlify.toml 2023-12-23 11:40:02 +01:00
Juan Picado
fd47fab9a8 Update netlify.toml 2023-12-23 11:07:12 +01:00
renovate[bot]
17cd8d4f36 chore(deps): update dependency @types/qs to v6.9.11 (#4317) 2023-12-21 23:29:02 +01:00
renovate[bot]
b22a3467c5 fix(deps): update dependency eslint-plugin-prettier to v5.1.1 (#4314) 2023-12-21 21:40:37 +01:00
verdacciobot
17e1479be5 chore: updated static data 2023-12-21 00:12:58 +00:00
renovate[bot]
5e4c768228 fix(deps): update dependency react-player to v2.14.1 (#4309)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-20 21:33:39 +01:00
renovate[bot]
22cf912483 chore(deps): update dependency html-webpack-plugin to v5.6.0 (#4310)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-20 21:33:21 +01:00
renovate[bot]
a2343d751b fix(deps): update dependency eslint-plugin-prettier to v5.1.0 (#4311)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-20 21:33:12 +01:00
Marc Bernard
88a91bdfc7 chore(website): enhance plugin search ui (#4294)
* chore(website): enhance plugin search ui

* Delete .changeset/popular-nails-behave.md

* Update addons.json
2023-12-20 21:32:58 +01:00
Marc Bernard
10be85cb7e chore: add note about disk space requirement to contribution guidelines (#4295) 2023-12-19 12:41:52 +01:00
dependabot[bot]
0ad768d01c chore(deps): bump actions/setup-node from 3.8.2 to 4.0.1 (#4298)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3.8.2 to 4.0.1.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](1a4442cacd...b39b52d121)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-18 21:38:06 +01:00
renovate[bot]
655bcceb0f chore(deps): update github/codeql-action digest to 03e7845 (#4302)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-18 21:37:52 +01:00
renovate[bot]
a730961df7 chore(deps): update actions/upload-artifact digest to a8a3f3a (#4301)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-18 21:37:44 +01:00
renovate[bot]
2ecf69cc86 chore(deps): update all linting dependencies to v6.15.0 (#4303)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-18 21:37:35 +01:00
dependabot[bot]
c01b9de325 chore(deps): bump github/codeql-action from 2.22.11 to 3.22.11 (#4300) 2023-12-18 13:41:51 +01:00
dependabot[bot]
b3f12c99b1 chore(deps): bump actions/upload-artifact from 3.1.3 to 4.0.0 (#4299) 2023-12-18 13:41:43 +01:00
renovate[bot]
e885cb126d chore(deps): update dependency @types/node to v20.10.5 (#4296)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-18 08:53:32 +01:00
verdacciobot
ec895bba79 chore: updated static data 2023-12-18 00:13:34 +00:00
renovate[bot]
74a8598355 chore(deps): update dependency @types/react-dom to v18.2.18 (#4290) 2023-12-16 09:26:14 +01:00
renovate[bot]
8c0058a9cf chore(deps): update dependency eslint to v8.56.0 (#4291) 2023-12-16 09:25:50 +01:00
renovate[bot]
d8ef641c76 chore(deps): update all linting dependencies (#4263)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-15 21:14:26 +01:00
renovate[bot]
c456d2e482 chore(deps): update dependency @types/react to v18.2.45 (#4272)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-15 20:23:53 +01:00
renovate[bot]
49aa66e480 fix(deps): update dependency marked-highlight to v2.1.0 (#4287)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-15 19:21:37 +01:00
renovate[bot]
d68392b102 chore(deps): update dependency fastify to v4.25.1 (#4289)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-15 17:45:27 +01:00
renovate[bot]
fb53818a47 fix(deps): update dependency react-player to v2.14.0 (#4284)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-15 08:46:51 +01:00
renovate[bot]
c80d26d926 fix(deps): update dependency pino to v8.17.1 (#4283)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-15 08:46:27 +01:00
renovate[bot]
c02f2cb725 fix(deps): update dependency pino to v8.17.0 (#4277) 2023-12-14 07:08:02 +01:00
renovate[bot]
d6b00b8074 chore(deps): update github/codeql-action digest to 03e7845 (#4279) 2023-12-14 07:07:44 +01:00
renovate[bot]
1749efbd49 chore(deps): update dependency whatwg-fetch to v3.6.20 (#4280) 2023-12-14 07:07:28 +01:00
verdacciobot
56c5e20007 chore: updated static data 2023-12-14 00:12:48 +00:00
renovate[bot]
e4a0231b6c fix(deps): update dependency react-hook-form to v7.49.2 (#4276) 2023-12-13 19:54:21 +01:00
renovate[bot]
c198c01488 chore(deps): update dependency fastify to v4.25.0 (#4278) 2023-12-13 19:53:48 +01:00
renovate[bot]
2cee1a5801 fix(deps): update dependency react-hook-form to v7.49.1 (#4273) 2023-12-13 06:22:44 +01:00
renovate[bot]
d0b7647443 fix(deps): update material-ui monorepo to v5.15.0 (#4271)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-12 22:41:44 +01:00
renovate[bot]
d0ac8155ee chore(deps): update dependency node-mocks-http to v1.14.0 (#4270)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-12 21:57:11 +01:00
renovate[bot]
58cd9fd647 chore(deps): update github/codeql-action digest to 305f654 (#4269)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-12 21:56:57 +01:00
renovate[bot]
7262c10093 fix(deps): update dependency marked to v11.1.0 (#4267)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-12 08:21:33 +01:00
renovate[bot]
2f85f85bb0 chore(deps): update babel monorepo to v7.23.6 (#4261) 2023-12-11 19:33:37 +01:00
verdacciobot
8030e8d5d0 chore: updated static data 2023-12-11 00:13:21 +00:00
renovate[bot]
34c8e141b7 chore(deps): update dependency prettier to v3.1.1 (#4257)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-10 12:32:59 +01:00
renovate[bot]
c6e5a67fd8 fix(deps): update dependency react-hook-form to v7.49.0 (#4256) 2023-12-10 07:48:12 +01:00
renovate[bot]
baa3f84e42 chore(deps): update dependency @types/react to v18.2.43 (#4255)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-09 18:25:30 +01:00
renovate[bot]
30d4e59a97 fix(deps): update dependency core-js to v3.34.0 (#4232)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-09 08:34:37 +01:00
renovate[bot]
df37f5d205 chore(deps): update dependency @types/react to v18.2.42 (#4228) 2023-12-08 21:58:27 +01:00
renovate[bot]
31005bc8b9 chore(deps): update dependency ts-node to v10.9.2 (#4248)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-08 19:22:31 +01:00
renovate[bot]
d5f7bdba0a fix(deps): update dependency @crowdin/crowdin-api-client to v1.28.2 (#4245)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-08 19:22:22 +01:00
renovate[bot]
c42f2d06bc fix(deps): update dependency npm to v10.2.5 (#4247) 2023-12-08 13:48:07 +01:00
renovate[bot]
995355f9c7 fix(deps): update dependency marked to v11.0.1 (#4246) 2023-12-08 12:32:42 +01:00
renovate[bot]
00fb00894c chore(deps): update dependency @types/react-virtualized to v9.21.29 (#4243)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-08 11:59:37 +01:00
renovate[bot]
e309047a77 chore(deps): update dependency html-webpack-plugin to v5.5.4 (#4244)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-08 11:59:25 +01:00
renovate[bot]
ba6a098bbe chore(deps): update github/codeql-action digest to c0d1daa (#4241)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-08 11:24:10 +01:00
renovate[bot]
2bed2788df chore(deps): update dependency @types/node to v20.10.4 (#4242)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-08 11:23:58 +01:00
renovate[bot]
ccb8317b65 chore(deps): update dependency @types/jest to v29.5.11 (#4235)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-08 10:43:30 +01:00
verdacciobot
6e7c215613 chore: updated static data 2023-12-07 00:13:14 +00:00
renovate[bot]
beb949e5a6 fix(deps): update material-ui monorepo to v5.14.20 (#4230)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-05 16:05:48 +01:00
verdacciobot
a2b08766a5 chore: updated static data 2023-12-05 09:16:49 +00:00
renovate[bot]
cda54ec4da chore(deps): update all linting dependencies to v6.13.2 (#4226)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-04 22:05:50 +01:00
renovate[bot]
d4ab275799 fix(deps): update dependency marked-highlight to v2.0.9 (#4225)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-04 18:46:15 +01:00
legobeat
b593588c02 deps(e2e/ui): cypress@^11.2.0->^13.6.0 (#4222) 2023-12-04 14:33:01 +01:00
renovate[bot]
d6bd489129 chore(deps): update dependency @types/node to v20.10.3 (#4219)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-04 07:44:35 +01:00
verdacciobot
ed3518ee24 chore: updated static data 2023-12-04 00:13:15 +00:00
renovate[bot]
c3e97fb6dd chore(deps): update dependency @types/react to v18.2.41 (#4168)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-03 21:56:05 +01:00
renovate[bot]
03314c15c5 fix(deps): update dependency sonic-boom to v3.7.0 (#4211)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 22:31:16 +01:00
renovate[bot]
3a47c6d6a9 fix(deps): update dependency copy-text-to-clipboard to v3.2.0 (#4209)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 22:22:58 +01:00
renovate[bot]
5e49905394 fix(deps): update dependency react-player to v2.13.0 (#4208)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 22:14:29 +01:00
renovate[bot]
9d601c9e34 chore(deps): update dependency webpack-merge to v5.10.0 (#4193)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 21:59:20 +01:00
renovate[bot]
c9b9a84ecb fix(deps): update dependency npm to v9.9.2 (#4206)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 21:59:08 +01:00
renovate[bot]
9604732736 fix(deps): update dependency core-js to v3.33.3 (#4194)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 21:57:04 +01:00
renovate[bot]
05608eb4e1 fix(deps): update dependency pino-abstract-transport to v1.1.0 (#4207)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 21:56:54 +01:00
renovate[bot]
33530632d6 fix(deps): update dependency activedirectory2 to v2.2.0 (#4205)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 21:53:57 +01:00
renovate[bot]
bb83a1a733 fix(deps): update dependency @crowdin/crowdin-api-client to v1.28.1 (#4200)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 21:37:45 +01:00
renovate[bot]
3c04696dd1 chore(deps): update dependency webpack-bundle-analyzer to v4.10.1 (#4192)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 20:17:16 +01:00
renovate[bot]
fdab6b8c89 chore(deps): update dependency yaml to v2.3.4 (#4178)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 20:04:25 +01:00
renovate[bot]
46915b0d10 fix(deps): update dependency http-status-codes to v2.3.0 (#4191)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 19:37:36 +01:00
renovate[bot]
e5d4e91e21 fix(deps): update dependency fastify-plugin to v4.5.1 (#4190)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 19:37:06 +01:00
renovate[bot]
4718b7c2d4 fix(deps): update dependency envinfo to v7.11.0 (#4189)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 19:33:10 +01:00
renovate[bot]
f63e216f20 chore(deps): update dependency webpack to v5.89.0 (#4188)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 19:15:10 +01:00
Juan Picado
843bf8009c update deps (#4183) 2023-12-02 18:52:27 +01:00
renovate[bot]
cf5c359ab9 chore(deps): update dependency nock to v13.4.0 (#4184)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 18:38:11 +01:00
renovate[bot]
aca5212a4f chore(deps): update dependency sass to v1.69.5 (#4185)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 18:38:02 +01:00
renovate[bot]
c8c7e5641f chore(deps): update dependency fastify to v4.24.3 (#4182)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 16:29:35 +01:00
renovate[bot]
0abdb8f301 chore(deps): update dependency @testing-library/react to v14.1.2 (#4181)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 16:27:17 +01:00
renovate[bot]
6741d7ed80 chore(deps): update dependency @types/superagent to v4.1.24 (#4153)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 15:44:32 +01:00
renovate[bot]
5e83d76b22 chore(deps): update dependency @storybook/testing-library to ^0.2.0 (#4177)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 15:44:23 +01:00
Juan Picado
b92528e1c8 remove @types/async dep 2023-12-02 15:22:20 +01:00
Juan Picado
0a7b39908a chore: remove @types/request dep 2023-12-02 15:21:39 +01:00
Juan Picado
c43e1be2c0 chore: remove github-markdown-css dep 2023-12-02 15:21:05 +01:00
Juan Picado
2f17367d21 chore: update apache config ci 2023-12-02 15:14:24 +01:00
Juan Picado
001896ecfb chore: update all types dependencies 2023-12-02 15:13:30 +01:00
renovate[bot]
3159458282 chore(deps): update dependency @crowdin/cli to v3.15.0 (#4176)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 15:07:04 +01:00
renovate[bot]
b8d6311c48 chore(deps): update dependency @changesets/cli to v2.27.1 (#4175)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 15:03:11 +01:00
Juan Picado
ab5bd360e4 chore: update e2e ci settings 2023-12-02 15:01:01 +01:00
renovate[bot]
238f6aeb92 chore(deps): update dependency @changesets/changelog-github to v0.5.0 (#4174)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 14:46:28 +01:00
Juan Picado
8cca64bd4f Update docker-proxy-nginx-e2e.yml 2023-12-02 14:44:28 +01:00
renovate[bot]
a491baaa4c chore(deps): update all linting dependencies (#4173) 2023-12-02 14:04:43 +01:00
renovate[bot]
793dcd54c0 fix(deps): update material-ui monorepo to v5.14.19 (#4170)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-02 11:51:32 +01:00
Lennart
58daf3c9bd docs: Add secco to "Who is using" (#4172) 2023-12-02 11:49:12 +01:00
renovate[bot]
c07ed76dc6 fix(deps): update dependency yarn to v1.22.21 (#4167) 2023-12-02 09:36:36 +01:00
renovate[bot]
db83206753 fix(deps): update docusaurus monorepo to v2.4.3 (#4169) 2023-12-02 09:36:25 +01:00
renovate[bot]
e585965389 fix(deps): update dependency memfs to v3.5.3 (#4164) 2023-12-01 22:47:05 +01:00
renovate[bot]
b1e1cfbd8f fix(deps): update dependency react-markdown to v8.0.7 (#4165) 2023-12-01 22:46:52 +01:00
renovate[bot]
9cffa22bd2 fix(deps): update dependency react-virtualized to v9.22.5 (#4166) 2023-12-01 22:46:43 +01:00
renovate[bot]
541ec22536 fix(deps): update dependency country-flag-icons to v1.5.9 (#4163) 2023-12-01 20:42:14 +01:00
renovate[bot]
2af11ee8e3 chore(deps): update dependency typescript to v4.9.5 (#4158) 2023-12-01 20:42:04 +01:00
renovate[bot]
12fd19d3dd chore(deps): update react monorepo (#4161) 2023-12-01 18:17:31 +01:00
renovate[bot]
87f5598070 chore(deps): update dependency whatwg-fetch to v3.6.19 (#4160) 2023-12-01 18:17:05 +01:00
renovate[bot]
fda7ff26e9 chore(deps): update dependency @types/validator to v13.11.7 (#4155) 2023-12-01 16:53:24 +01:00
renovate[bot]
b313e56f75 chore(deps): update dependency terser-webpack-plugin to v5.3.9 (#4157) 2023-12-01 16:53:04 +01:00
renovate[bot]
667f705c0e chore(deps): update dependency @types/jsonwebtoken to v9.0.5 (#4142) 2023-12-01 10:00:20 +01:00
renovate[bot]
5e850af59b chore(deps): update dependency @types/webpack-env to v1.18.4 (#4156) 2023-12-01 10:00:02 +01:00
renovate[bot]
4e31fdf651 chore(deps): update dependency @types/jest to v29.5.10 (#4141) 2023-12-01 06:37:57 +01:00
renovate[bot]
326ec28930 chore(deps): update dependency @types/send to v0.17.4 (#4151) 2023-12-01 05:46:34 +01:00
renovate[bot]
afce58da48 chore(deps): update dependency @types/qs to v6.9.10 (#4146) 2023-12-01 05:46:10 +01:00
renovate[bot]
277ca7ee71 chore(deps): update dependency @types/express to v4.17.21 (#4138)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-01 04:55:24 +01:00
renovate[bot]
a07ff6350e chore(deps): update dependency @testing-library/jest-dom to v6.1.5 (#4150)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-01 04:55:14 +01:00
renovate[bot]
851eb5541f chore(deps): update dependency @types/semver to v7.5.6 (#4149)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-30 21:11:17 +01:00
renovate[bot]
c5831f3479 chore(deps): update dependency @types/mime to v3.0.4 (#4144)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-30 19:26:38 +01:00
renovate[bot]
7dd4494c2d chore(deps): update dependency @types/range-parser to v1.2.7 (#4147)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-30 19:26:28 +01:00
renovate[bot]
4136fc2e49 chore(deps): update dependency @types/http-errors to v2.0.4 (#4140)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-30 16:09:51 +01:00
renovate[bot]
287983c1c0 chore(deps): update dependency @types/node-fetch to v2.6.9 (#4145)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-30 16:09:42 +01:00
renovate[bot]
0b7f5a7e22 chore(deps): update dependency @types/connect to v3.4.38 (#4136) 2023-11-30 08:33:24 +01:00
renovate[bot]
cc4c113b0d chore(deps): update dependency @types/cookiejar to v2.1.5 (#4137)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-30 07:44:12 +01:00
verdacciobot
56f728c312 chore: updated static data 2023-11-30 00:12:57 +00:00
renovate[bot]
bf16931eef chore(deps): update babel monorepo to v7.23.5 (#4134) 2023-11-29 22:16:51 +01:00
renovate[bot]
789a2b2020 chore(deps): update dependency @types/async to v3.2.24 (#4135) 2023-11-29 22:16:37 +01:00
renovate[bot]
f93a5181f4 fix(deps): update dependency dayjs to v1.11.10 (#4130)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-29 22:00:03 +01:00
renovate[bot]
9395365d65 fix(deps): update dependency handlebars to v4.7.8 (#4131)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-29 21:59:50 +01:00
Juan Picado
0bda2c6fde Update renovate.json 2023-11-29 21:28:01 +01:00
Juan Picado
4912d31387 Update renovate.json 2023-11-29 21:25:33 +01:00
renovate[bot]
422bf8dba5 fix(deps): update dependency npm to v10.2.4 (#4121)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-29 21:21:02 +01:00
Juan Picado
77764b11a9 chore: improve docker ci 2023-11-29 20:50:45 +01:00
Juan Picado
795df2bf9a chore: fix website ci 2023-11-29 20:08:23 +01:00
Juan Picado
e5d71046e9 chore: fix website ci 2023-11-29 20:06:23 +01:00
Juan Picado
22212eeea1 chore: fix website ci 2023-11-29 20:02:58 +01:00
Juan Picado
faf5895db4 chore: fix website ci 2023-11-29 20:00:58 +01:00
Juan Picado
0fbc09d7da chore: update website config 2023-11-29 19:44:07 +01:00
renovate[bot]
54582b0594 chore(deps): update babel monorepo to v7.23.4 (#4126)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-29 07:29:14 +01:00
renovate[bot]
a188439abc chore(deps): update actions/github-script digest to d7906e4 (#4123)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-27 18:12:27 +01:00
dependabot[bot]
cca9308d0f chore(deps): bump github/codeql-action from 2.22.7 to 2.22.8 (#4127)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.22.7 to 2.22.8.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](66b90a5db1...407ffafae6)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-27 18:12:18 +01:00
verdacciobot
ffbb890600 chore: updated static data 2023-11-27 00:13:13 +00:00
renovate[bot]
4d53066fac fix(deps): update dependency pino to v8.16.2 (#4122) 2023-11-23 17:23:37 +01:00
verdacciobot
98852b400d chore: updated static data 2023-11-23 00:12:53 +00:00
dependabot[bot]
7085c0b075 chore(deps): bump actions/github-script from 6.4.1 to 7.0.1 (#4119)
Bumps [actions/github-script](https://github.com/actions/github-script) from 6.4.1 to 7.0.1.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](d7906e4ad0...60a0d83039)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-20 17:27:41 +01:00
renovate[bot]
85e640d8d8 chore(deps): update dependency @types/bcryptjs to v2.4.6 (#4118)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-20 08:27:03 +01:00
renovate[bot]
8d00ca9029 chore(deps): update github/codeql-action digest to 66b90a5 (#4117)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-20 08:26:55 +01:00
verdacciobot
6b4603feaa chore: updated static data 2023-11-20 00:12:53 +00:00
Juan Picado
8ffdb6623c Update docker-proxy-nginx-e2e.yml 2023-11-19 11:35:33 +01:00
verdacciobot
cdeca77f4b chore: updated static data 2023-11-16 00:12:44 +00:00
renovate[bot]
14f8469d1b chore(deps): update dependency @types/async to v3.2.23 (#4116)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-14 12:23:06 +01:00
renovate[bot]
82d34ae4dc chore(deps): update dependency @types/activedirectory2 to v1.2.6 (#4115)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-13 08:12:50 +01:00
verdacciobot
400e4e6428 chore: updated static data 2023-11-13 00:13:45 +00:00
Juan Picado
c4e89143f3 update readme 2023-11-12 21:39:08 +01:00
renovate[bot]
1627957276 chore(deps): update babel monorepo to v7.23.3 (#4110)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-10 06:57:37 +01:00
renovate[bot]
357f39b78a fix(deps): update dependency dompurify to v2.4.7 (#4103)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-10 06:27:23 +01:00
verdacciobot
17087ffa97 chore: updated static data 2023-11-09 00:13:16 +00:00
renovate[bot]
acdf96aa33 chore(deps): update dependency @types/body-parser to v1.19.5 (#4105)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-07 11:20:46 +01:00
renovate[bot]
95674ecf69 chore(deps): update all linting dependencies (#4104)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-06 07:09:14 +01:00
verdacciobot
3a200ee37f chore: updated static data 2023-11-06 00:13:34 +00:00
verdacciobot
c6400203cf chore: updated static data 2023-11-02 00:12:58 +00:00
renovate[bot]
46ef5f0532 chore(deps): update actions/setup-node digest to 1a4442c (#4098)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-30 20:06:46 +01:00
renovate[bot]
491c788845 chore(deps): update dependency @types/bcryptjs to v2.4.5 (#4101)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-30 07:24:41 +01:00
verdacciobot
e4e7fcea3a chore: updated static data 2023-10-30 00:13:32 +00:00
renovate[bot]
461d95cef3 fix(deps): update dependency validator to v13.11.0 (#4095)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-29 10:25:24 +01:00
renovate[bot]
aedb209520 fix(deps): update dependency @crowdin/crowdin-api-client to v1.25.1 (#4092)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-28 18:10:34 +02:00
Juan Picado
376eb53788 chore: update docker node base v21 2023-10-28 17:52:57 +02:00
213 changed files with 11762 additions and 10326 deletions

View File

@@ -0,0 +1,7 @@
---
'@verdaccio/store': patch
'@verdaccio/tarball': patch
---
- Fixes polynomial regular expression when determining the file name of tarball
- Add tests for extracting tarball name

View File

@@ -1,6 +1,6 @@
{
"mode": "pre",
"tag": "next",
"tag": "next-7",
"initialVersions": {
"@verdaccio/test-cli-commons": "1.1.0",
"@verdaccio/e2e-cli-npm6": "1.0.1",
@@ -64,9 +64,15 @@
"eight-squids-judge",
"long-jars-collect",
"old-turkeys-heal",
"olive-bananas-wink",
"perfect-chairs-act",
"real-socks-vanish",
"shiny-worms-retire",
"shy-carrots-compare",
"shy-garlics-cry",
"weak-fans-explain"
"strange-points-repair",
"weak-fans-explain",
"wild-otters-talk",
"young-donuts-own"
]
}

View File

@@ -0,0 +1,5 @@
---
'verdaccio': patch
---
chore: test release

View File

@@ -0,0 +1,14 @@
---
'@verdaccio/server': minor
'@verdaccio/test-helper': minor
'@verdaccio/types': minor
'@verdaccio/middleware': minor
'@verdaccio/core': minor
'@verdaccio/signature': minor
'@verdaccio/url': minor
'@verdaccio/config': minor
'@verdaccio/auth': minor
'@verdaccio/api': minor
---
refactor: auth with legacy sign support

View File

@@ -0,0 +1,6 @@
---
'@verdaccio/ui-theme': patch
'@verdaccio/ui-components': patch
---
fix: render READMEs with correct font and highlighting

View File

@@ -0,0 +1,5 @@
---
'@verdaccio/api': patch
---
fix: bug on change password npm profile

View File

@@ -0,0 +1,5 @@
---
'@verdaccio/config': patch
---
chore(config): increase test coverage

View File

@@ -25,16 +25,16 @@ jobs:
fetch-depth: 0
- name: setup node.js
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version-file: '.nvmrc'
env:
NODE_AUTH_TOKEN: ${{ secrets.REGISTRY_AUTH_TOKEN }}
- name: install pnpm
run: npm i pnpm@8.9.0 -g
env:
NODE_AUTH_TOKEN: ${{ secrets.REGISTRY_AUTH_TOKEN }}
- name: Install pnpm
run: |
corepack enable
corepack install
- name: setup pnpm config
run: pnpm config set store-dir $PNPM_CACHE_FOLDER

View File

@@ -20,7 +20,7 @@ jobs:
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- name: Node
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version-file: '.nvmrc'
- name: Install pnpm
@@ -36,7 +36,7 @@ jobs:
- name: Install
run: pnpm install --registry http://localhost:4873
- name: Cache .pnpm-store
uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
@@ -49,12 +49,12 @@ jobs:
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- name: Node
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version-file: '.nvmrc'
- name: Install pnpm
run: npm i pnpm@latest-8 -g
- uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
@@ -73,12 +73,12 @@ jobs:
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- name: Use Node
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version-file: '.nvmrc'
- name: Install pnpm
run: npm i pnpm@latest-8 -g
- uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
@@ -102,12 +102,12 @@ jobs:
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- name: Use Node ${{ matrix.node_version }}
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version: ${{ matrix.node_version }}
- name: Install pnpm
run: npm i pnpm@latest-8 -g
- uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
@@ -127,12 +127,12 @@ jobs:
name: UI Test E2E
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
- uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version-file: '.nvmrc'
- name: Install pnpm
run: npm i pnpm@latest-8 -g
- uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}

View File

@@ -29,7 +29,7 @@ jobs:
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- name: Node
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version-file: '.nvmrc'
- name: Install pnpm
@@ -43,7 +43,7 @@ jobs:
- name: Install
run: pnpm install --registry http://localhost:4873
- name: Cache .pnpm-store
uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
@@ -56,14 +56,14 @@ jobs:
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- name: Node
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version-file: '.nvmrc'
- name: Install pnpm
run: |
corepack enable
corepack install
- uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
@@ -81,14 +81,14 @@ jobs:
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- name: Use Node
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version-file: '.nvmrc'
- name: Install pnpm
run: |
corepack enable
corepack install
- uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
@@ -100,25 +100,25 @@ jobs:
- name: Lint
run: pnpm format:check
test:
needs: [format, lint]
needs: [prepare]
strategy:
fail-fast: true
matrix:
os: [ubuntu-latest]
node_version: [18, 20]
node_version: [18, 20, 21]
name: ${{ matrix.os }} / Node ${{ matrix.node_version }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- name: Use Node ${{ matrix.node_version }}
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version: ${{ matrix.node_version }}
- name: Install pnpm
run: |
corepack enable
corepack prepare --activate pnpm@8.9.0
- uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
corepack prepare
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
@@ -138,14 +138,14 @@ jobs:
if: (github.event_name == 'push' && github.ref == 'refs/heads/master') || github.event_name == 'workflow_dispatch'
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
- uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version-file: '.nvmrc'
- name: Install pnpm
run: |
corepack enable
corepack install
- uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}

View File

@@ -34,7 +34,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@74483a38d39275f33fcff5f35b679b5ca4a26a99 # v2
uses: github/codeql-action/init@e8893c57a1f3a2b659b6b55564fdfdbbd2982911 # v2
# Override language selection by uncommenting this and choosing your languages
# with:
@@ -42,7 +42,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@74483a38d39275f33fcff5f35b679b5ca4a26a99 # v2
uses: github/codeql-action/autobuild@e8893c57a1f3a2b659b6b55564fdfdbbd2982911 # v2
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@@ -56,4 +56,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@74483a38d39275f33fcff5f35b679b5ca4a26a99 # v2
uses: github/codeql-action/analyze@e8893c57a1f3a2b659b6b55564fdfdbbd2982911 # v2

View File

@@ -12,7 +12,8 @@ jobs:
docker:
timeout-minutes: 10
runs-on: ubuntu-latest
env:
NODE_OPTIONS: --max_old_space_size=4096
steps:
- name: Checkout
uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
@@ -21,15 +22,21 @@ jobs:
run: docker-compose -f "./e2e/docker/apache-verdaccio/docker-compose.yaml" up -d --build
- name: Install node
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version: 18
node-version-file: '.nvmrc'
- name: npm setup
run: |
npm config set fetch-retries="10"
npm config set fetch-retry-factor="50"
npm config set fetch-retry-mintimeout="20000"
npm config set fetch-retry-maxtimeout="80000"
- name: verdaccio cli
run: npm install -g verdaccio --registry http://localhost
- name: gastby cli
run: npm install -g gatsby-cli --registry http://localhost
- name: netlify cli
run: npm install -g netlify-cli --registry http://localhost
# - name: netlify cli
# run: npm install -g netlify-cli --registry http://localhost
- name: angular cli
run: npm install -g @angular/cli --registry http://localhost

View File

@@ -9,7 +9,8 @@ jobs:
docker:
timeout-minutes: 10
runs-on: ubuntu-latest
env:
NODE_OPTIONS: --max_old_space_size=4096
steps:
- name: Checkout
uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
@@ -18,12 +19,12 @@ jobs:
run: docker-compose -f "./e2e/docker/proxy-nginx/docker-compose.yaml" up -d --build
- name: Install node
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version: 18
node-version-file: '.nvmrc'
- name: npm setup
run: |
npm config set fetch-retries="5"
npm config set fetch-retries="10"
npm config set fetch-retry-factor="50"
npm config set fetch-retry-mintimeout="20000"
npm config set fetch-retry-maxtimeout="80000"
@@ -31,8 +32,8 @@ jobs:
run: npm install -g verdaccio --registry http://localhost
- name: gastby cli
run: npm install -g gatsby-cli --registry http://localhost
- name: netlify cli
run: npm install -g netlify-cli --registry http://localhost
#- name: netlify cli
# run: npm install -g netlify-cli --registry http://localhost
- name: angular cli
run: npm install -g @angular/cli --registry http://localhost

View File

@@ -17,13 +17,13 @@ jobs:
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- name: Use Node
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version-file: '.nvmrc'
- name: Install pnpm
run: |
corepack enable
corepack prepare --activate pnpm@8.9.0
corepack prepare
- name: set store
run: |
mkdir ~/.pnpm-store
@@ -31,7 +31,7 @@ jobs:
- name: Install
run: pnpm install --reporter=silence --ignore-scripts --registry http://localhost:4873
- name: Cache .pnpm-store
uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}-${{ github.sha }}
@@ -43,14 +43,14 @@ jobs:
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- name: Use Node 16
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version-file: '.nvmrc'
- name: Install pnpm
run: |
corepack enable
corepack prepare --activate pnpm@8.9.0
- uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
corepack prepare
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}-${{ github.sha }}
@@ -62,7 +62,7 @@ jobs:
- name: build
run: pnpm build
- name: Cache packages
uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
id: cache-packages
with:
path: ./packages/
@@ -77,7 +77,7 @@ jobs:
# key: test-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}-${{ github.sha }}
# restore-keys: |
# test-
e2e-cli:
e2e-cli-npm:
needs: [prepare, build]
strategy:
fail-fast: false
@@ -88,28 +88,21 @@ jobs:
npm7,
npm8,
npm9,
npm10,
pnpm6,
pnpm7,
pnpm8,
yarn1,
yarn2,
yarn3,
yarn4,
npm10
]
node: [16, 18, 19]
node: [20, 21]
name: ${{ matrix.pkg }}/ ubuntu-latest / ${{ matrix.node }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
- uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version: ${{ matrix.node }}
- name: Install pnpm
run: |
corepack enable
corepack prepare --activate pnpm@8.9.0
- uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
corepack prepare
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}-${{ github.sha }}
@@ -118,7 +111,7 @@ jobs:
pnpm config set store-dir ~/.pnpm-store
- name: Install
run: pnpm install --offline --reporter=silence --ignore-scripts --registry http://localhost:4873
- uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ./packages/
key: pkg-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}-${{ github.sha }}
@@ -130,3 +123,94 @@ jobs:
run: pnpm --filter @verdaccio/test-cli-commons build
- name: Test CLI
run: NODE_ENV=production pnpm test --filter ...@verdaccio/e2e-cli-${{matrix.pkg}}
# TODO: fix pnpm setup
# e2e-cli-pnpm:
# needs: [prepare, build]
# strategy:
# fail-fast: true
# matrix:
# pkg:
# [
# pnpm6,
# pnpm7,
# pnpm8
# ]
# node: [20, 21]
# name: ${{ matrix.pkg }}/ ubuntu-latest / ${{ matrix.node }}
# runs-on: ubuntu-latest
# steps:
# - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
# - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
# with:
# node-version: ${{ matrix.node }}
# - name: Install pnpm
# run: |
# corepack enable
# corepack prepare
# - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
# with:
# path: ~/.pnpm-store
# key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}-${{ github.sha }}
# - name: set store
# run: |
# pnpm config set store-dir ~/.pnpm-store
# - name: Install
# run: pnpm install --loglevel debug --ignore-scripts --registry http://localhost:4873
# - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
# with:
# path: ./packages/
# key: pkg-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}-${{ github.sha }}
# # - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 # tag=v3
# # with:
# # path: ./e2e/
# # key: test-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}-${{ github.sha }}
# - name: build e2e
# run: pnpm --filter @verdaccio/test-cli-commons build
# - name: Test CLI
# run: NODE_ENV=production pnpm test --filter ...@verdaccio/e2e-cli-${{matrix.pkg}}
e2e-cli-yarn:
needs: [prepare, build]
strategy:
fail-fast: false
matrix:
pkg:
[
yarn1,
yarn2,
yarn3,
yarn4
]
node: [20, 21]
name: ${{ matrix.pkg }}/ ubuntu-latest / ${{ matrix.node }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version: ${{ matrix.node }}
- name: Install pnpm
run: |
corepack enable
corepack prepare
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}-${{ github.sha }}
- name: set store
run: |
pnpm config set store-dir ~/.pnpm-store
- name: Install
run: pnpm install --offline --reporter=silence --ignore-scripts --registry http://localhost:4873
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ./packages/
key: pkg-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}-${{ github.sha }}
# - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 # tag=v3
# with:
# path: ./e2e/
# key: test-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}-${{ github.sha }}
- name: build e2e
run: pnpm --filter @verdaccio/test-cli-commons build
- name: Test CLI
run: NODE_ENV=production pnpm test --filter ...@verdaccio/e2e-cli-${{matrix.pkg}}

View File

@@ -17,13 +17,13 @@ jobs:
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- name: Use Node
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version-file: '.nvmrc'
- name: Install pnpm
run: |
corepack enable
corepack install
corepack prepare
- name: Install
run: pnpm install --reporter=silence --registry http://localhost:4873
- name: build

View File

@@ -23,7 +23,7 @@ jobs:
with:
persist-credentials: false
fetch-depth: 0
- uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
- uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version: 18.x
- name: install pnpm

View File

@@ -2,13 +2,6 @@ name: UI Components
on:
workflow_dispatch:
pull_request:
paths:
- .github/workflows/ui-components.yml
- 'packages/ui-components/**'
- 'package.json'
- 'pnpm-workspace.yaml'
- 'pnpm-lock.yaml'
permissions:
contents: read # to fetch code (actions/checkout)
@@ -30,12 +23,12 @@ jobs:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- name: Use Node
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version-file: '.nvmrc'
- name: Cache pnpm modules
uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
env:
cache-name: cache-pnpm-modules
with:

View File

@@ -3,6 +3,9 @@ name: Verdaccio Website CI
on:
workflow_dispatch:
pull_request:
branches-ignore:
- 'renovate/*'
- 'dependabot/*'
paths:
- 'website/**'
- './.github/workflows/website.yml'
@@ -20,38 +23,46 @@ jobs:
pull-requests: write # to comment on pull-requests
runs-on: ubuntu-latest
name: setup verdaccio
services:
verdaccio:
image: verdaccio/verdaccio:5
ports:
- 4873:4873
env:
NODE_ENV: production
env:
NODE_OPTIONS: --max_old_space_size=4096
steps:
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
- name: Use Node 16
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # tag=v3
- name: Node
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
with:
node-version: 16
- name: Cache pnpm modules
uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
env:
cache-name: cache-pnpm-modules
node-version-file: '.nvmrc'
- name: Install pnpm
run: |
corepack enable
corepack install
- name: set store
run: |
mkdir ~/.pnpm-store
pnpm config set store-dir ~/.pnpm-store
- name: Install
run: pnpm install --registry http://localhost:4873
- name: Cache .pnpm-store
uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ matrix.node-version }}-${{ hashFiles('**/pnpm-lock.yaml') }}
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-${{ matrix.node-version }}-
- uses: pnpm/action-setup@d882d12c64e032187b2edb46d3a0d003b7a43598 # tag=v2.4.0
with:
version: latest-8
run_install: |
- recursive: true
args: [--frozen-lockfile]
pnpm-
- name: Build
run: pnpm build
- name: Build Translations percentage
run: pnpm --filter @verdaccio/crowdin-translations build
- name: Cache Docusaurus Build
uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3
with:
path: website/node_modules/.cache/webpack
key: cache/webpack-${{github.ref}}-${{ hashFiles('**/pnpm-lock.yaml') }}
@@ -100,7 +111,7 @@ jobs:
- name: Audit preview URL with Lighthouse
if: github.repository == 'verdaccio/verdaccio'
id: lighthouse_audit
uses: treosh/lighthouse-ci-action@03becbfc543944dd6e7534f7ff768abb8a296826 # tag=10.1.0
uses: treosh/lighthouse-ci-action@1b0e7c33270fbba31a18a0fbb1de7cc5256b6d39 # tag=11.4.0
with:
urls: |
${{ steps.netlify_preview.outputs.preview-url }}
@@ -109,7 +120,7 @@ jobs:
- name: Format lighthouse score
id: format_lighthouse_score
uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # tag=v6
uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
@@ -134,7 +145,7 @@ jobs:
- name: Add comment to PR
if: github.repository == 'verdaccio/verdaccio'
id: comment_to_pr
uses: marocchino/sticky-pull-request-comment@efaaab3fd41a9c3de579aba759d2552635e590fd # v2
uses: marocchino/sticky-pull-request-comment@331f8f5b4215f0445d3c07b4967662a32a2d3e31 # v2
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
number: ${{ github.event.issue.number }}

1
.npmrc
View File

@@ -1,3 +1,2 @@
always-auth = true
loglevel=info
fetch-retries="10"

15
.prettierrc Normal file
View File

@@ -0,0 +1,15 @@
{
"endOfLine": "lf",
"useTabs": false,
"printWidth": 100,
"tabWidth": 2,
"singleQuote": true,
"bracketSpacing": true,
"trailingComma": "es5",
"semi": true,
"plugins": ["@trivago/prettier-plugin-sort-imports"],
"importOrder": ["^@verdaccio/(.*)$", "^[./]"],
"importOrderSeparation": true,
"importOrderParserPlugins": ["typescript", "classProperties", "jsx"],
"importOrderSortSpecifiers": true
}

View File

@@ -1,13 +1,10 @@
// Place your settings in this file to overwrite default and user settings.
{
"files.exclude": {
"**/.nyc_output": true,
"**/build": false,
"**/coverage": true,
".idea": true,
"storage_default_storage": true,
".yarn": true
},
"editor.formatOnSave": true,
"typescript.tsdk": "node_modules/typescript/lib"
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
}

View File

@@ -29,6 +29,8 @@ The Verdaccio project is split into several areas, the first three hosted in the
## Prepare local setup {#local-setup}
**Note**: The size of the Verdaccio project is quite significant. Unzipped it is about 33 MB. However, a full build with all node_modules installed takes about **2.8 GB** of disk space (~190k files)!
Verdaccio uses [pnpm](https://pnpm.io) as the package manager for development in this repository.
If you are using pnpm for the first time the [pnpm configuration documentation](https://pnpm.io/configuring) may be useful to avoid any potential problems with the following steps.
@@ -46,16 +48,15 @@ We use [corepack](https://github.com/nodejs/corepack) to install and use a speci
```shell
nvm install
corepack enable
corepack install
```
`pnpm` version will be updated mainly by the maintainers but if you would like to set it to a specific version, you can do so by running the following command:
```shell
corepack use pnpm@8.9.1
```
> `packageManager` at the `package.json` defines the default version to be used.
It will update the `package.json` file with the new version of pnpm in the `packageManager` field.
```shell
corepack prepare
```
With pnpm installed, the first step is installing all dependencies:

View File

@@ -1,4 +1,4 @@
FROM --platform=${BUILDPLATFORM:-linux/amd64} node:18-alpine as builder
FROM --platform=${BUILDPLATFORM:-linux/amd64} node:21-alpine as builder
ENV NODE_ENV=development \
VERDACCIO_BUILD_REGISTRY=https://registry.npmjs.org
@@ -20,7 +20,7 @@ RUN npm -g i pnpm@8.9.0 && \
# NODE_ENV=production pnpm install --frozen-lockfile --ignore-scripts
# RUN pnpm install --prod --ignore-scripts
FROM node:18-alpine
FROM node:21-alpine
LABEL maintainer="https://github.com/verdaccio/verdaccio"
ENV VERDACCIO_APPDIR=/opt/verdaccio \

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2021 Verdaccio contributors
Copyright (c) 2024 Verdaccio contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -33,7 +33,6 @@ Google Cloud Storage** or create your own plugin.
[![MIT](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/verdaccio/localized.svg)](https://crowdin.com/project/verdaccio)
[![Twitter followers](https://img.shields.io/twitter/follow/verdaccio_npm.svg?style=social&label=Follow)](https://twitter.com/verdaccio_npm)
[![Github](https://img.shields.io/github/stars/verdaccio/verdaccio.svg?style=social&label=Stars)](https://github.com/verdaccio/verdaccio/stargazers)
[![StandWithUkraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md)

View File

@@ -91,8 +91,8 @@ class LocalMemory {
(_this$data = this.data) === null || _this$data === void 0
? void 0
: (_this$data$list = _this$data.list) === null || _this$data$list === void 0
? void 0
: _this$data$list.length
? void 0
: _this$data$list.length
);
return Promise.resolve(
(_this$data2 = this.data) === null || _this$data2 === void 0 ? void 0 : _this$data2.list

View File

@@ -5,16 +5,16 @@
"main": "./build/index.js",
"types": "./build/index.d.ts",
"devDependencies": {
"@verdaccio/config": "workspace:7.0.0-next.4",
"@verdaccio/core": "workspace:7.0.0-next.4",
"@verdaccio/types": "workspace:12.0.0-next.1",
"@verdaccio/config": "workspace:7.0.0-next-7.8",
"@verdaccio/core": "workspace:7.0.0-next-7.8",
"@verdaccio/types": "workspace:12.0.0-next.2",
"debug": "4.3.4",
"fs-extra": "10.1.0",
"fs-extra": "11.2.0",
"get-port": "5.1.1",
"got": "11.8.6",
"js-yaml": "4.1.0",
"get-port": "5.1.1",
"lodash": "4.17.21",
"verdaccio": "workspace:7.0.0-next.4"
"verdaccio": "workspace:7.0.0-next-7.8"
},
"scripts": {
"test": "jest",

View File

@@ -4,7 +4,7 @@
"version": "1.0.1",
"dependencies": {
"@verdaccio/test-cli-commons": "workspace:1.1.0",
"npm": "10.1.0"
"npm": "10.3.0"
},
"scripts": {
"test": "jest"

View File

@@ -4,7 +4,7 @@
"version": "1.0.1",
"dependencies": {
"@verdaccio/test-cli-commons": "workspace:1.1.0",
"npm": "9.7.1"
"npm": "9.9.2"
},
"scripts": {
"test": "jest"

View File

@@ -4,7 +4,7 @@
"version": "1.0.1",
"dependencies": {
"@verdaccio/test-cli-commons": "workspace:1.1.0",
"npm": "9.7.1"
"npm": "9.9.2"
},
"scripts": {
"test": "jest"

View File

@@ -4,7 +4,7 @@
"version": "1.0.1",
"dependencies": {
"@verdaccio/test-cli-commons": "workspace:1.1.0",
"npm": "9.7.1"
"npm": "9.9.2"
},
"scripts": {
"test": "jest"

View File

@@ -4,7 +4,7 @@
"version": "1.0.1",
"dependencies": {
"@verdaccio/test-cli-commons": "workspace:1.1.0",
"npm": "9.7.1"
"npm": "9.9.2"
},
"scripts": {
"test": "jest"

View File

@@ -4,7 +4,7 @@
"version": "1.0.1",
"dependencies": {
"@verdaccio/test-cli-commons": "workspace:1.1.0",
"yarn": "1.22.19"
"yarn": "1.22.21"
},
"scripts": {
"test": "jest"

View File

@@ -9,6 +9,10 @@ import { generatePackageMetadata } from '@verdaccio/test-helper';
let registry1;
export default defineConfig({
retries: {
runMode: 5,
openMode: 0,
},
e2e: {
setupNodeEvents(on) {
on('before:run', async () => {

View File

@@ -3,12 +3,12 @@
"name": "@verdaccio/e2e-ui",
"version": "2.0.0",
"devDependencies": {
"verdaccio": "workspace:7.0.0-next.4",
"@verdaccio/core": "workspace:7.0.0-next.4",
"@verdaccio/config": "workspace:7.0.0-next.4",
"@verdaccio/test-helper": "workspace:3.0.0-next.0",
"verdaccio": "workspace:7.0.0-next-7.8",
"@verdaccio/core": "workspace:7.0.0-next-7.8",
"@verdaccio/config": "workspace:7.0.0-next-7.8",
"@verdaccio/test-helper": "workspace:3.0.0-next.1",
"debug": "4.3.4",
"cypress": "^11.2.0",
"cypress": "^13.6.0",
"get-port": "5.1.1"
},
"scripts": {

View File

@@ -4,7 +4,7 @@ module.exports = {
'^.+\\.(js|ts)$': 'babel-jest',
},
verbose: false,
collectCoverage: true,
collectCoverage: false,
coverageReporters: ['text', 'html'],
collectCoverageFrom: ['src/**/*.ts', '!**/node_modules/**', '!**/partials/**', '!**/fixture/**'],
coveragePathIgnorePatterns: ['node_modules', 'fixtures'],

View File

@@ -17,3 +17,11 @@
[[plugins]]
package = "../.netlify/netlify-plugin-pnpm"
[[headers]]
for = "/*"
[headers.values]
X-Frame-Options = "DENY"
X-XSS-Protection = "1; mode=block"
X-Content-Type-Options = "nosniff"
Referrer-Policy = "no-referrer"

View File

@@ -15,92 +15,90 @@
"url": "https://opencollective.com/verdaccio"
},
"devDependencies": {
"@babel/cli": "7.23.0",
"@babel/core": "7.23.2",
"@babel/eslint-parser": "7.22.15",
"@babel/node": "7.22.19",
"@babel/cli": "7.23.9",
"@babel/core": "7.23.9",
"@babel/eslint-parser": "7.23.3",
"@babel/node": "7.23.9",
"@babel/plugin-proposal-class-properties": "7.18.6",
"@babel/plugin-proposal-decorators": "7.23.2",
"@babel/plugin-proposal-decorators": "7.23.9",
"@babel/plugin-proposal-export-namespace-from": "7.18.9",
"@babel/plugin-proposal-function-sent": "7.22.5",
"@babel/plugin-proposal-function-sent": "7.23.3",
"@babel/plugin-proposal-json-strings": "7.18.6",
"@babel/plugin-proposal-nullish-coalescing-operator": "7.18.6",
"@babel/plugin-proposal-numeric-separator": "7.18.6",
"@babel/plugin-proposal-object-rest-spread": "7.20.7",
"@babel/plugin-proposal-optional-chaining": "7.21.0",
"@babel/plugin-proposal-throw-expressions": "7.22.5",
"@babel/plugin-proposal-throw-expressions": "7.23.3",
"@babel/plugin-syntax-dynamic-import": "7.8.3",
"@babel/plugin-syntax-import-meta": "7.10.4",
"@babel/plugin-transform-async-to-generator": "7.22.5",
"@babel/plugin-transform-classes": "7.22.15",
"@babel/plugin-transform-runtime": "7.23.2",
"@babel/preset-env": "7.23.2",
"@babel/preset-react": "7.22.15",
"@babel/preset-typescript": "7.23.2",
"@babel/register": "7.22.15",
"@babel/runtime": "7.23.2",
"@changesets/changelog-github": "0.4.8",
"@changesets/cli": "2.24.4",
"@babel/plugin-transform-async-to-generator": "7.23.3",
"@babel/plugin-transform-classes": "7.23.8",
"@babel/plugin-transform-runtime": "7.23.9",
"@babel/preset-env": "7.23.9",
"@babel/preset-react": "7.23.3",
"@babel/preset-typescript": "7.23.3",
"@babel/register": "7.23.7",
"@babel/runtime": "7.23.9",
"@changesets/changelog-github": "0.5.0",
"@changesets/cli": "2.27.1",
"@changesets/get-dependents-graph": "1.3.6",
"@crowdin/cli": "3.14.0",
"@crowdin/cli": "3.16.1",
"@dianmora/contributors": "5.0.0",
"@emotion/react": "11.10.6",
"@emotion/styled": "11.10.6",
"@testing-library/dom": "9.3.3",
"@testing-library/jest-dom": "6.1.4",
"@testing-library/react": "14.0.0",
"@trivago/prettier-plugin-sort-imports": "^4.2.0",
"@types/async": "3.2.21",
"@types/body-parser": "1.19.2",
"@types/connect": "3.4.36",
"@types/cookiejar": "2.1.2",
"@types/debug": "^4.1.9",
"@types/express": "4.17.18",
"@types/express-serve-static-core": "4.17.37",
"@types/http-errors": "2.0.2",
"@types/jest": "29.5.5",
"@types/jsonwebtoken": "9.0.3",
"@types/lodash": "4.14.199",
"@types/mime": "3.0.2",
"@testing-library/dom": "9.3.4",
"@testing-library/jest-dom": "6.3.0",
"@testing-library/react": "14.1.2",
"@trivago/prettier-plugin-sort-imports": "4.3.0",
"@types/body-parser": "1.19.5",
"@types/connect": "3.4.38",
"@types/cookiejar": "2.1.5",
"@types/debug": "4.1.12",
"@types/express": "4.17.21",
"@types/express-serve-static-core": "4.17.42",
"@types/http-errors": "2.0.4",
"@types/jest": "29.5.11",
"@types/jsonwebtoken": "9.0.5",
"@types/lodash": "4.14.202",
"@types/mime": "3.0.4",
"@types/minimatch": "5.1.2",
"@types/node": "20.8.3",
"@types/node-fetch": "2.6.6",
"@types/qs": "6.9.8",
"@types/range-parser": "1.2.5",
"@types/react": "18.2.25",
"@types/react-dom": "18.2.11",
"@types/node": "20.11.7",
"@types/node-fetch": "2.6.11",
"@types/qs": "6.9.11",
"@types/range-parser": "1.2.7",
"@types/react": "18.2.48",
"@types/react-dom": "18.2.18",
"@types/react-router-dom": "5.3.3",
"@types/react-virtualized": "9.21.23",
"@types/react-virtualized": "9.21.29",
"@types/redux": "3.6.0",
"@types/request": "2.48.9",
"@types/semver": "7.5.3",
"@types/send": "0.17.2",
"@types/serve-static": "1.15.3",
"@types/superagent": "4.1.19",
"@types/supertest": "2.0.14",
"@types/semver": "7.5.6",
"@types/send": "0.17.4",
"@types/serve-static": "1.15.5",
"@types/superagent": "4.1.24",
"@types/supertest": "2.0.16",
"@types/testing-library__jest-dom": "6.0.0",
"@types/validator": "13.11.2",
"@types/webpack": "5.28.3",
"@types/webpack-env": "1.18.2",
"@typescript-eslint/eslint-plugin": "6.9.0",
"@typescript-eslint/parser": "6.9.0",
"@types/validator": "13.11.8",
"@types/webpack": "5.28.5",
"@types/webpack-env": "1.18.4",
"@typescript-eslint/eslint-plugin": "6.19.1",
"@typescript-eslint/parser": "6.19.1",
"@verdaccio/crowdin-translations": "workspace:*",
"@verdaccio/eslint-config": "workspace:*",
"@verdaccio/types": "workspace:*",
"@verdaccio/ui-theme": "workspace:*",
"@vitest/coverage-v8": "^0.34.6",
"@vitest/coverage-v8": "0.34.6",
"babel-core": "7.0.0-bridge.0",
"babel-jest": "29.7.0",
"babel-plugin-dynamic-import-node": "2.3.3",
"babel-plugin-emotion": "11.0.0",
"concurrently": "6.5.1",
"concurrently": "8.2.2",
"cross-env": "7.0.3",
"debug": "4.3.4",
"detect-secrets": "1.0.6",
"eslint": "8.52.0",
"fs-extra": "10.1.0",
"eslint": "8.56.0",
"fs-extra": "11.2.0",
"got": "11.8.6",
"husky": "7.0.4",
"husky": "8.0.3",
"in-publish": "2.0.1",
"jest": "29.7.0",
"jest-diff": "29.7.0",
@@ -110,23 +108,24 @@
"jest-junit": "16.0.0",
"kleur": "4.1.5",
"lint-staged": "11.2.6",
"nock": "13.3.3",
"nodemon": "2.0.22",
"npm-run-all": "4.1.5",
"prettier": "2.8.8",
"nock": "13.5.1",
"nodemon": "3.0.3",
"npm-run-all2": "5.0.0",
"prettier": "3.2.2",
"react": "18.2.0",
"react-dom": "18.2.0",
"rimraf": "3.0.2",
"selfsigned": "1.10.14",
"supertest": "6.3.3",
"ts-node": "10.9.1",
"typescript": "5.2.2",
"update-ts-references": "2.6.1",
"rimraf": "5.0.5",
"selfsigned": "2.4.1",
"supertest": "6.3.4",
"ts-node": "10.9.2",
"typescript": "5.3.3",
"undici-types": "5.28.2",
"update-ts-references": "3.2.1",
"verdaccio-audit": "workspace:*",
"verdaccio-auth-memory": "workspace:*",
"verdaccio-htpasswd": "workspace:*",
"verdaccio-memory": "workspace:*",
"vitest": "^0.34.3"
"vitest": "0.34.6"
},
"scripts": {
"prepare": "husky install",
@@ -172,12 +171,6 @@
"local:publish": "cross-env npm_config_registry=http://localhost:4873 changeset publish --no-git-tag",
"local:publish:release": "concurrently \"pnpm local:registry\" \"pnpm local:publish\""
},
"pnpm": {
"overrides": {
"got": "11.8.5",
"p-cancelable": "2.1.1"
}
},
"engines": {
"node": ">=18"
},
@@ -186,5 +179,5 @@
"*.{js,jsx,ts,tsx,json,yml,yaml,md}": "prettier --write",
"*.{js,jsx,ts,tsx}": "eslint --cache --fix"
},
"packageManager": "pnpm@8.9.0+sha256.8f5264ad1d100da11a6add6bb8a94c6f1e913f9e9261b2a551fabefad2ec0fec"
"packageManager": "pnpm@8.14.0+sha256.9cebf61abd83f68177b29484da72da9751390eaad46dfc3072d266bfbb1ba7bf"
}

View File

@@ -1,5 +1,61 @@
# @verdaccio/api
## 7.0.0-next-7.8
### Patch Changes
- 74cd588: fix: bug on change password npm profile
- @verdaccio/core@7.0.0-next-7.8
- @verdaccio/config@7.0.0-next-7.8
- @verdaccio/auth@7.0.0-next-7.8
- @verdaccio/middleware@7.0.0-next-7.8
- @verdaccio/store@7.0.0-next-7.8
- @verdaccio/utils@7.0.0-next-7.8
- @verdaccio/logger@7.0.0-next-7.8
## 7.0.0-next-7.7
### Patch Changes
- @verdaccio/core@7.0.0-next-7.7
- @verdaccio/config@7.0.0-next-7.7
- @verdaccio/auth@7.0.0-next-7.7
- @verdaccio/middleware@7.0.0-next-7.7
- @verdaccio/store@7.0.0-next-7.7
- @verdaccio/utils@7.0.0-next-7.7
- @verdaccio/logger@7.0.0-next-7.7
## 7.0.0-next.6
### Patch Changes
- Updated dependencies [e14b064]
- Updated dependencies [4d96324]
- @verdaccio/store@7.0.0-next.6
- @verdaccio/config@7.0.0-next.6
- @verdaccio/auth@7.0.0-next.6
- @verdaccio/middleware@7.0.0-next.6
- @verdaccio/core@7.0.0-next.6
- @verdaccio/utils@7.0.0-next.6
- @verdaccio/logger@7.0.0-next.6
## 7.0.0-next.5
### Minor Changes
- f047cc8: refactor: auth with legacy sign support
### Patch Changes
- Updated dependencies [f047cc8]
- @verdaccio/middleware@7.0.0-next.5
- @verdaccio/core@7.0.0-next.5
- @verdaccio/config@7.0.0-next.5
- @verdaccio/auth@7.0.0-next.5
- @verdaccio/store@7.0.0-next.5
- @verdaccio/logger@7.0.0-next.5
- @verdaccio/utils@7.0.0-next.5
## 7.0.0-next.4
### Patch Changes

View File

@@ -1,10 +1,3 @@
const config = require('../../jest/config');
module.exports = Object.assign({}, config, {
coverageThreshold: {
global: {
// FIXME: increase to 90
lines: 60,
},
},
});
module.exports = Object.assign({}, config, {});

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/api",
"version": "7.0.0-next.4",
"version": "7.0.0-next-7.8",
"description": "loaders logic",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -38,16 +38,16 @@
},
"license": "MIT",
"dependencies": {
"@verdaccio/auth": "workspace:7.0.0-next.4",
"@verdaccio/config": "workspace:7.0.0-next.4",
"@verdaccio/core": "workspace:7.0.0-next.4",
"@verdaccio/logger": "workspace:7.0.0-next.4",
"@verdaccio/middleware": "workspace:7.0.0-next.4",
"@verdaccio/store": "workspace:7.0.0-next.4",
"@verdaccio/utils": "workspace:7.0.0-next.4",
"@verdaccio/auth": "workspace:7.0.0-next-7.8",
"@verdaccio/config": "workspace:7.0.0-next-7.8",
"@verdaccio/core": "workspace:7.0.0-next-7.8",
"@verdaccio/logger": "workspace:7.0.0-next-7.8",
"@verdaccio/middleware": "workspace:7.0.0-next-7.8",
"@verdaccio/store": "workspace:7.0.0-next-7.8",
"@verdaccio/utils": "workspace:7.0.0-next-7.8",
"abortcontroller-polyfill": "1.7.5",
"body-parser": "1.20.2",
"cookies": "0.8.0",
"cookies": "0.9.0",
"debug": "4.3.4",
"express": "4.18.2",
"lodash": "4.17.21",
@@ -55,12 +55,11 @@
"semver": "7.5.4"
},
"devDependencies": {
"@verdaccio/server": "workspace:7.0.0-next.4",
"@verdaccio/test-helper": "workspace:3.0.0-next.0",
"@verdaccio/types": "workspace:12.0.0-next.1",
"@verdaccio/test-helper": "workspace:3.0.0-next.1",
"@verdaccio/types": "workspace:12.0.0-next.2",
"mockdate": "3.0.5",
"nock": "13.3.3",
"supertest": "6.3.3"
"nock": "13.5.1",
"supertest": "6.3.4"
},
"funding": {
"type": "opencollective",

View File

@@ -81,15 +81,17 @@ export default function (route: Router, auth: Auth, config: Config): void {
/* eslint new-cap:off */
}
if (_.isEmpty(password.old)) {
return next(errorUtils.getBadRequest('old password is required'));
}
auth.changePassword(
name,
password.old,
password.new,
(err, isUpdated): $NextFunctionVer => {
if (_.isNull(err) === false) {
return next(
errorUtils.getCode(err.status, err.message) || errorUtils.getConflict(err.message)
);
return next(errorUtils.getForbidden(err.message));
}
if (isUpdated) {

View File

@@ -0,0 +1,27 @@
auth:
htpasswd:
file: ./htpasswd-profile
web:
enable: true
title: verdaccio
uplinks:
log: { type: stdout, format: pretty, level: trace }
packages:
'@*/*':
access: $all
publish: $all
unpublish: $all
proxy: npmjs
'verdaccio':
access: $all
publish: $all
'**':
access: $all
publish: $all
unpublish: $all
proxy: npmjs
_debug: true

View File

@@ -26,8 +26,8 @@ describe('package', () => {
});
test.each([
['foo', 'foo-1.0.0.tgz'],
['@scope/foo', 'foo-1.0.0.tgz'],
['foo2', 'foo2-1.0.0.tgz'],
['@scope/foo2', 'foo2-1.0.0.tgz'],
])('should fails if tarball does not exist', async (pkg, fileName) => {
await publishVersion(app, pkg, '1.0.1');
return await supertest(app)

View File

@@ -0,0 +1,111 @@
import supertest from 'supertest';
import { HEADERS, HEADER_TYPE, HTTP_STATUS, TOKEN_BEARER } from '@verdaccio/core';
import { buildToken } from '@verdaccio/utils';
import { createUser, initializeServer } from './_helper';
describe('profile ', () => {
describe('get profile ', () => {
test('should return Unauthorized if header token is missing', async () => {
const app = await initializeServer('profile.yaml');
return supertest(app)
.get('/-/npm/v1/user')
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
.expect(HTTP_STATUS.UNAUTHORIZED);
});
test('should return user details', async () => {
const app = await initializeServer('profile.yaml');
const credentials = { name: 'test', password: 'test' };
const response = await createUser(app, credentials.name, credentials.password);
return supertest(app)
.get('/-/npm/v1/user')
.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, response.body.token))
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
.expect(HTTP_STATUS.OK);
});
});
describe('post profile ', () => {
test('should return Unauthorized if header token is missing', async () => {
const app = await initializeServer('profile.yaml');
return supertest(app)
.post('/-/npm/v1/user')
.send({})
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
.expect(HTTP_STATUS.UNAUTHORIZED);
});
test('should return handle to short new password', async () => {
const app = await initializeServer('profile.yaml');
const credentials = { name: 'test', password: 'test' };
const response = await createUser(app, credentials.name, credentials.password);
return supertest(app)
.post('/-/npm/v1/user')
.send({ password: { new: '_' } })
.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, response.body.token))
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
.expect(HTTP_STATUS.UNAUTHORIZED);
});
test('should return handle to missing old password', async () => {
const app = await initializeServer('profile.yaml');
const credentials = { name: 'test', password: 'test' };
const response = await createUser(app, credentials.name, credentials.password);
return supertest(app)
.post('/-/npm/v1/user')
.send({ password: { new: 'fooooo', old: undefined } })
.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, response.body.token))
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
.expect(HTTP_STATUS.BAD_REQUEST);
});
test('should return handle to missing password', async () => {
const app = await initializeServer('profile.yaml');
const credentials = { name: 'test', password: 'test' };
const response = await createUser(app, credentials.name, credentials.password);
return supertest(app)
.post('/-/npm/v1/user')
.send({ another: '_' })
.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, response.body.token))
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
.expect(HTTP_STATUS.INTERNAL_ERROR);
});
test('should return handle change password', async () => {
const app = await initializeServer('profile.yaml');
const credentials = { name: 'test', password: 'test' };
const response = await createUser(app, credentials.name, credentials.password);
return supertest(app)
.post('/-/npm/v1/user')
.send({ password: { new: 'good password_.%#@$@#$@#', old: 'test' } })
.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, response.body.token))
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
.expect(HTTP_STATUS.OK);
});
test('should return handle change password failure', async () => {
const app = await initializeServer('profile.yaml');
const credentials = { name: 'test', password: 'test' };
const response = await createUser(app, credentials.name, credentials.password);
return supertest(app)
.post('/-/npm/v1/user')
.send({ password: { new: 'good password_.%#@$@#$@#', old: 'test_do_not_match' } })
.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, response.body.token))
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
.expect(HTTP_STATUS.FORBIDDEN);
});
test('should handle tfa ( two factor auth) disabled', async () => {
const app = await initializeServer('profile.yaml');
const credentials = { name: 'test', password: 'test' };
const response = await createUser(app, credentials.name, credentials.password);
return supertest(app)
.post('/-/npm/v1/user')
.send({ tfa: '_' })
.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, response.body.token))
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
.expect(HTTP_STATUS.SERVICE_UNAVAILABLE);
});
});
});

View File

@@ -1,5 +1,59 @@
# @verdaccio/auth
## 7.0.0-next-7.8
### Patch Changes
- @verdaccio/core@7.0.0-next-7.8
- @verdaccio/config@7.0.0-next-7.8
- @verdaccio/loaders@7.0.0-next-7.8
- verdaccio-htpasswd@12.0.0-next-7.8
- @verdaccio/utils@7.0.0-next-7.8
- @verdaccio/signature@7.0.0-next.3
- @verdaccio/logger@7.0.0-next-7.8
## 7.0.0-next-7.7
### Patch Changes
- @verdaccio/core@7.0.0-next-7.7
- @verdaccio/config@7.0.0-next-7.7
- @verdaccio/loaders@7.0.0-next-7.7
- verdaccio-htpasswd@12.0.0-next-7.7
- @verdaccio/utils@7.0.0-next-7.7
- @verdaccio/signature@7.0.0-next.3
- @verdaccio/logger@7.0.0-next-7.7
## 7.0.0-next.6
### Patch Changes
- Updated dependencies [4d96324]
- @verdaccio/config@7.0.0-next.6
- @verdaccio/loaders@7.0.0-next.6
- verdaccio-htpasswd@12.0.0-next.6
- @verdaccio/signature@7.0.0-next.3
- @verdaccio/core@7.0.0-next.6
- @verdaccio/utils@7.0.0-next.6
- @verdaccio/logger@7.0.0-next.6
## 7.0.0-next.5
### Minor Changes
- f047cc8: refactor: auth with legacy sign support
### Patch Changes
- Updated dependencies [f047cc8]
- @verdaccio/core@7.0.0-next.5
- @verdaccio/signature@7.0.0-next.3
- @verdaccio/config@7.0.0-next.5
- @verdaccio/loaders@7.0.0-next.5
- @verdaccio/logger@7.0.0-next.5
- verdaccio-htpasswd@12.0.0-next.5
- @verdaccio/utils@7.0.0-next.5
## 7.0.0-next.4
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/auth",
"version": "7.0.0-next.4",
"version": "7.0.0-next-7.8",
"description": "logger",
"main": "./build/index.js",
"types": "./build/index.d.ts",
@@ -38,19 +38,21 @@
},
"license": "MIT",
"dependencies": {
"@verdaccio/core": "workspace:7.0.0-next.4",
"@verdaccio/config": "workspace:7.0.0-next.4",
"@verdaccio/loaders": "workspace:7.0.0-next.4",
"@verdaccio/logger": "workspace:7.0.0-next.4",
"@verdaccio/signature": "workspace:7.0.0-next.2",
"@verdaccio/utils": "workspace:7.0.0-next.4",
"@verdaccio/core": "workspace:7.0.0-next-7.8",
"@verdaccio/config": "workspace:7.0.0-next-7.8",
"@verdaccio/loaders": "workspace:7.0.0-next-7.8",
"@verdaccio/logger": "workspace:7.0.0-next-7.8",
"@verdaccio/signature": "workspace:7.0.0-next.3",
"@verdaccio/utils": "workspace:7.0.0-next-7.8",
"debug": "4.3.4",
"express": "4.18.2",
"lodash": "4.17.21",
"verdaccio-htpasswd": "workspace:12.0.0-next.4"
"verdaccio-htpasswd": "workspace:12.0.0-next-7.8"
},
"devDependencies": {
"@verdaccio/types": "workspace:12.0.0-next.1"
"express": "4.18.2",
"supertest": "6.3.4",
"@verdaccio/middleware": "workspace:7.0.0-next-7.8",
"@verdaccio/types": "workspace:12.0.0-next.2"
},
"funding": {
"type": "opencollective",

View File

@@ -1,5 +1,4 @@
import buildDebug from 'debug';
import { NextFunction, Request, Response } from 'express';
import _ from 'lodash';
import { HTPasswd } from 'verdaccio-htpasswd';
@@ -12,22 +11,36 @@ import {
VerdaccioError,
errorUtils,
pluginUtils,
warningUtils,
} from '@verdaccio/core';
import '@verdaccio/core';
import { asyncLoadPlugin } from '@verdaccio/loaders';
import { logger } from '@verdaccio/logger';
import { aesEncrypt, parseBasicPayload, signPayload } from '@verdaccio/signature';
import {
aesEncrypt,
aesEncryptDeprecated,
parseBasicPayload,
signPayload,
} from '@verdaccio/signature';
import {
AllowAccess,
Callback,
Config,
JWTSignOptions,
Logger,
PackageAccess,
RemoteUser,
Security,
} from '@verdaccio/types';
import { getMatchedPackagesSpec, isFunction, isNil } from '@verdaccio/utils';
import {
$RequestExtend,
$ResponseExtend,
AESPayload,
IAuthMiddleware,
NextFunction,
TokenEncryption,
} from './types';
import {
convertPayloadToBase64,
getDefaultPlugins,
@@ -40,25 +53,6 @@ import {
const debug = buildDebug('verdaccio:auth');
export interface TokenEncryption {
jwtEncrypt(user: RemoteUser, signOptions: JWTSignOptions): Promise<string>;
aesEncrypt(buf: string): string | void;
}
// remove
export interface AESPayload {
user: string;
password: string;
}
export interface IAuthMiddleware {
apiJWTmiddleware(): $NextFunctionVer;
webUIJWTmiddleware(): $NextFunctionVer;
}
export type $RequestExtend = Request & { remote_user?: any; log: Logger };
export type $ResponseExtend = Response & { cookies?: any };
export type $NextFunctionVer = NextFunction & any;
class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
public config: Config;
public secret: string;
@@ -75,6 +69,7 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
public async init() {
let plugins = (await this.loadPlugin()) as pluginUtils.Auth<unknown>[];
debug('auth plugins found %s', plugins.length);
if (!plugins || plugins.length === 0) {
plugins = this.loadDefaultPlugin();
@@ -226,29 +221,32 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
debug('add user %o', user);
(function next(): void {
let method = 'adduser';
const plugin = plugins.shift() as pluginUtils.Auth<Config>;
if (typeof plugin.adduser !== 'function') {
// @ts-expect-error future major (7.x) should remove this section
if (typeof plugin.adduser === 'undefined' && typeof plugin.add_user === 'function') {
method = 'add_user';
warningUtils.emit(warningUtils.Codes.VERWAR006);
}
// @ts-ignore
if (typeof plugin[method] !== 'function') {
next();
} else {
// @ts-expect-error future major (7.x) should remove this section
if (typeof plugin.adduser === 'undefined' && typeof plugin.add_user === 'function') {
throw errorUtils.getInternalError(
'add_user method not longer supported, rename to adduser'
);
}
plugin.adduser(
// TODO: replace by adduser whenever add_user deprecation method has been removed
// @ts-ignore
plugin[method](
user,
password,
function (err: VerdaccioError | null, ok?: boolean | string): void {
if (err) {
debug('the user %o could not being added. Error: %o', user, err?.message);
debug('the user %o could not being added. Error: %o', user, err?.message);
return cb(err);
}
if (ok) {
debug('the user %o has been added', user);
return self.authenticate(user, password, cb);
}
debug('user could not be added, skip to next auth plugin');
next();
}
);
@@ -375,7 +373,7 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
})();
}
public apiJWTmiddleware() {
public apiJWTmiddleware(): any {
debug('jwt middleware');
const plugins = this.plugins.slice(0);
const helpers = { createAnonymousRemoteUser, createRemoteUser };
@@ -387,8 +385,7 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
return (req: $RequestExtend, res: $ResponseExtend, _next: NextFunction) => {
req.pause();
const next = function (err?: VerdaccioError): any {
const next = function (err?: VerdaccioError): NextFunction {
req.resume();
// uncomment this to reject users with bad auth headers
// return _next.apply(null, arguments)
@@ -398,13 +395,14 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
req.remote_user.error = err.message;
}
return _next();
return _next() as unknown as NextFunction;
};
if (this._isRemoteUserValid(req.remote_user)) {
debug('jwt has a valid authentication header');
return next();
}
// FUTURE: disabled, not removed yet but seems unreacable code
// if (this._isRemoteUserValid(req.remote_user)) {
// debug('jwt has a valid authentication header');
// return next();
// }
// in case auth header does not exist we return anonymous function
const remoteUser = createAnonymousRemoteUser();
@@ -425,20 +423,20 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
if (isAESLegacy(security)) {
debug('api middleware using legacy auth token');
this._handleAESMiddleware(req, security, secret, authorization, next);
this.handleAESMiddleware(req, security, secret, authorization, next);
} else {
debug('api middleware using JWT auth token');
this._handleJWTAPIMiddleware(req, security, secret, authorization, next);
this.handleJWTAPIMiddleware(req, security, secret, authorization, next);
}
};
}
private _handleJWTAPIMiddleware(
private handleJWTAPIMiddleware(
req: $RequestExtend,
security: Security,
secret: string,
authorization: string,
next: Function
next: any
): void {
debug('handle JWT api middleware');
const { scheme, token } = parseAuthTokenHeader(authorization);
@@ -475,7 +473,7 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
}
}
private _handleAESMiddleware(
private handleAESMiddleware(
req: $RequestExtend,
security: Security,
secret: string,
@@ -485,7 +483,12 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
debug('handle legacy api middleware');
debug('api middleware secret %o', typeof secret === 'string');
debug('api middleware authorization %o', typeof authorization === 'string');
const credentials: any = getMiddlewareCredentials(security, secret, authorization);
const credentials: any = getMiddlewareCredentials(
security,
secret,
authorization,
this.config?.getEnhancedLegacySignature()
);
debug('api middleware credentials %o', credentials?.name);
if (credentials) {
const { user, password } = credentials;
@@ -515,7 +518,7 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
/**
* JWT middleware for WebUI
*/
public webUIJWTmiddleware(): $NextFunctionVer {
public webUIJWTmiddleware() {
return (req: $RequestExtend, res: $ResponseExtend, _next: NextFunction): void => {
if (this._isRemoteUserValid(req.remote_user)) {
return _next();
@@ -525,7 +528,7 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
const next = (err: VerdaccioError | void): void => {
req.resume();
if (err) {
// req.remote_user.error = err.message;
req.remote_user.error = err.message;
res.status(err.statusCode).send(err.message);
}
@@ -576,7 +579,6 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
name,
groups: groupedGroups,
};
const token: string = await signPayload(payload, this.secret, signOptions);
return token;
@@ -586,7 +588,17 @@ class Auth implements IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
* Encrypt a string.
*/
public aesEncrypt(value: string): string | void {
return aesEncrypt(value, this.secret);
// enhancedLegacySignature enables modern aes192 algorithm signature
if (this.config?.getEnhancedLegacySignature()) {
debug('signing with enhaced aes legacy');
const token = aesEncrypt(value, this.secret);
return token;
} else {
debug('signing with enhaced aes deprecated legacy');
// deprecated aes (legacy) signature, only must be used for legacy version
const token = aesEncryptDeprecated(Buffer.from(value), this.secret).toString('base64');
return token;
}
}
}

View File

@@ -1,2 +1,3 @@
export { Auth } from './auth';
export * from './utils';
export * from './types';

View File

@@ -0,0 +1,66 @@
import buildDebug from 'debug';
import _ from 'lodash';
import { TOKEN_BASIC, TOKEN_BEARER } from '@verdaccio/core';
import { aesDecryptDeprecated as aesDecrypt, parseBasicPayload } from '@verdaccio/signature';
import { Security } from '@verdaccio/types';
import { AuthMiddlewarePayload } from './types';
import {
convertPayloadToBase64,
isAESLegacy,
parseAuthTokenHeader,
verifyJWTPayload,
} from './utils';
const debug = buildDebug('verdaccio:auth:utils');
export function parseAESCredentials(authorizationHeader: string, secret: string) {
debug('parseAESCredentials');
const { scheme, token } = parseAuthTokenHeader(authorizationHeader);
// basic is deprecated and should not be enforced
// basic is currently being used for functional test
if (scheme.toUpperCase() === TOKEN_BASIC.toUpperCase()) {
debug('legacy header basic');
const credentials = convertPayloadToBase64(token).toString();
return credentials;
} else if (scheme.toUpperCase() === TOKEN_BEARER.toUpperCase()) {
debug('legacy header bearer');
const credentials = aesDecrypt(Buffer.from(token), secret);
return credentials;
}
}
export function getMiddlewareCredentials(
security: Security,
secretKey: string,
authorizationHeader: string
): AuthMiddlewarePayload {
debug('getMiddlewareCredentials');
// comment out for debugging purposes
if (isAESLegacy(security)) {
debug('is legacy');
const credentials = parseAESCredentials(authorizationHeader, secretKey);
if (typeof credentials !== 'string') {
debug('parse legacy credentials failed');
return;
}
const parsedCredentials = parseBasicPayload(credentials);
if (!parsedCredentials) {
debug('parse legacy basic payload credentials failed');
return;
}
return parsedCredentials;
}
const { scheme, token } = parseAuthTokenHeader(authorizationHeader);
debug('is jwt');
if (_.isString(token) && scheme.toUpperCase() === TOKEN_BEARER.toUpperCase()) {
return verifyJWTPayload(token, secretKey);
}
}

View File

@@ -0,0 +1,66 @@
import buildDebug from 'debug';
import _ from 'lodash';
import { TOKEN_BASIC, TOKEN_BEARER } from '@verdaccio/core';
import { aesDecrypt, parseBasicPayload } from '@verdaccio/signature';
import { Security } from '@verdaccio/types';
import { AuthMiddlewarePayload } from './types';
import {
convertPayloadToBase64,
isAESLegacy,
parseAuthTokenHeader,
verifyJWTPayload,
} from './utils';
const debug = buildDebug('verdaccio:auth:utils');
export function parseAESCredentials(authorizationHeader: string, secret: string) {
debug('parseAESCredentials');
const { scheme, token } = parseAuthTokenHeader(authorizationHeader);
// basic is deprecated and should not be enforced
// basic is currently being used for functional test
if (scheme.toUpperCase() === TOKEN_BASIC.toUpperCase()) {
debug('legacy header basic');
const credentials = convertPayloadToBase64(token).toString();
return credentials;
} else if (scheme.toUpperCase() === TOKEN_BEARER.toUpperCase()) {
debug('legacy header bearer');
const credentials = aesDecrypt(token, secret);
return credentials;
}
}
export function getMiddlewareCredentials(
security: Security,
secretKey: string,
authorizationHeader: string
): AuthMiddlewarePayload {
debug('getMiddlewareCredentials');
// comment out for debugging purposes
if (isAESLegacy(security)) {
debug('is legacy');
const credentials = parseAESCredentials(authorizationHeader, secretKey);
if (!credentials) {
debug('parse legacy credentials failed');
return;
}
const parsedCredentials = parseBasicPayload(credentials);
if (!parsedCredentials) {
debug('parse legacy basic payload credentials failed');
return;
}
return parsedCredentials;
}
const { scheme, token } = parseAuthTokenHeader(authorizationHeader);
debug('is jwt');
if (_.isString(token) && scheme.toUpperCase() === TOKEN_BEARER.toUpperCase()) {
return verifyJWTPayload(token, secretKey);
}
}

View File

@@ -0,0 +1,46 @@
import { NextFunction, Request, Response } from 'express';
import { VerdaccioError } from '@verdaccio/core';
import { AuthPackageAllow, JWTSignOptions, Logger, RemoteUser } from '@verdaccio/types';
export interface AESPayload {
user: string;
password: string;
}
export type BasicPayload = AESPayload | void;
export type AuthMiddlewarePayload = RemoteUser | BasicPayload;
export interface AuthTokenHeader {
scheme: string;
token: string;
}
export type AllowActionCallbackResponse = boolean | undefined;
export type AllowActionCallback = (
error: VerdaccioError | null,
allowed?: AllowActionCallbackResponse
) => void;
export type AllowAction = (
user: RemoteUser,
pkg: AuthPackageAllow,
callback: AllowActionCallback
) => void;
export interface TokenEncryption {
jwtEncrypt(user: RemoteUser, signOptions: JWTSignOptions): Promise<string>;
aesEncrypt(buf: string): string | void;
}
export type ActionsAllowed = 'publish' | 'unpublish' | 'access';
// remove
export interface IAuthMiddleware {
apiJWTmiddleware(): $NextFunctionVer;
webUIJWTmiddleware(): $NextFunctionVer;
}
export type $RequestExtend = Request & { remote_user?: any; log: Logger };
export type $ResponseExtend = Response & { cookies?: any };
export type $NextFunctionVer = NextFunction & any;
export { NextFunction };

View File

@@ -7,36 +7,28 @@ import {
HTTP_STATUS,
TOKEN_BASIC,
TOKEN_BEARER,
VerdaccioError,
errorUtils,
pluginUtils,
} from '@verdaccio/core';
import { aesDecrypt, parseBasicPayload, verifyPayload } from '@verdaccio/signature';
import {
aesDecrypt,
aesDecryptDeprecated,
parseBasicPayload,
verifyPayload,
} from '@verdaccio/signature';
import { AuthPackageAllow, Config, Logger, RemoteUser, Security } from '@verdaccio/types';
import { AESPayload, TokenEncryption } from './auth';
import {
ActionsAllowed,
AllowAction,
AllowActionCallback,
AuthMiddlewarePayload,
AuthTokenHeader,
TokenEncryption,
} from './types';
const debug = buildDebug('verdaccio:auth:utils');
export type BasicPayload = AESPayload | void;
export type AuthMiddlewarePayload = RemoteUser | BasicPayload;
export interface AuthTokenHeader {
scheme: string;
token: string;
}
export type AllowActionCallbackResponse = boolean | undefined;
export type AllowActionCallback = (
error: VerdaccioError | null,
allowed?: AllowActionCallbackResponse
) => void;
export type AllowAction = (
user: RemoteUser,
pkg: AuthPackageAllow,
callback: AllowActionCallback
) => void;
/**
* Split authentication header eg: Bearer [secret_token]
* @param authorizationHeader auth token
@@ -48,7 +40,11 @@ export function parseAuthTokenHeader(authorizationHeader: string): AuthTokenHead
return { scheme, token };
}
export function parseAESCredentials(authorizationHeader: string, secret: string) {
export function parseAESCredentials(
authorizationHeader: string,
secret: string,
enhanced: boolean
) {
debug('parseAESCredentials');
const { scheme, token } = parseAuthTokenHeader(authorizationHeader);
@@ -61,7 +57,11 @@ export function parseAESCredentials(authorizationHeader: string, secret: string)
return credentials;
} else if (scheme.toUpperCase() === TOKEN_BEARER.toUpperCase()) {
debug('legacy header bearer');
const credentials = aesDecrypt(token, secret);
debug('legacy header enhanced?', enhanced);
const credentials = enhanced
? aesDecrypt(token.toString(), secret)
: // FUTURE: once deprecated legacy is removed this logic won't be longer need it
aesDecryptDeprecated(convertPayloadToBase64(token), secret).toString('utf-8');
return credentials;
}
@@ -70,13 +70,14 @@ export function parseAESCredentials(authorizationHeader: string, secret: string)
export function getMiddlewareCredentials(
security: Security,
secretKey: string,
authorizationHeader: string
authorizationHeader: string,
enhanced: boolean = true
): AuthMiddlewarePayload {
debug('getMiddlewareCredentials');
// comment out for debugging purposes
if (isAESLegacy(security)) {
debug('is legacy');
const credentials = parseAESCredentials(authorizationHeader, secretKey);
const credentials = parseAESCredentials(authorizationHeader, secretKey, enhanced);
if (!credentials) {
debug('parse legacy credentials failed');
return;
@@ -161,14 +162,15 @@ export function isAuthHeaderValid(authorization: string): boolean {
export function getDefaultPlugins(logger: Logger): pluginUtils.Auth<Config> {
return {
authenticate(_user: string, _password: string, cb: pluginUtils.AuthCallback): void {
debug('triggered default authenticate method');
cb(errorUtils.getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));
},
adduser(_user: string, _password: string, cb: pluginUtils.AuthUserCallback): void {
debug('triggered default adduser method');
return cb(errorUtils.getConflict(API_ERROR.BAD_USERNAME_PASSWORD));
},
// FIXME: allow_action and allow_publish should be in the @verdaccio/types
// @ts-ignore
allow_access: allow_action('access', logger),
// @ts-ignore
@@ -177,8 +179,6 @@ export function getDefaultPlugins(logger: Logger): pluginUtils.Auth<Config> {
};
}
export type ActionsAllowed = 'publish' | 'unpublish' | 'access';
export function allow_action(action: ActionsAllowed, logger: Logger): AllowAction {
return function allowActionCallback(
user: RemoteUser,
@@ -187,8 +187,13 @@ export function allow_action(action: ActionsAllowed, logger: Logger): AllowActio
): void {
logger.trace({ remote: user.name }, `[auth/allow_action]: user: @{remote}`);
const { name, groups } = user;
debug('allow_action "%s": groups %s', action, groups);
const groupAccess = pkg[action] as string[];
const hasPermission = groupAccess.some((group) => name === group || groups.includes(group));
debug('allow_action "%s": groupAccess %s', action, groupAccess);
const hasPermission = groupAccess.some((group) => {
return name === group || groups.includes(group);
});
debug('package "%s" has permission "%s"', name, hasPermission);
logger.trace(
{ pkgName: pkg.name, hasPermission, remote: user.name, groupAccess },
`[auth/allow_action]: hasPermission? @{hasPermission} for user: @{remote}, package: @{pkgName}`
@@ -218,7 +223,8 @@ export function handleSpecialUnpublish(logger: Logger): any {
return function (user: RemoteUser, pkg: AuthPackageAllow, callback: AllowActionCallback): void {
const action = 'unpublish';
// verify whether the unpublish prop has been defined
const isUnpublishMissing: boolean = _.isNil(pkg[action]);
const isUnpublishMissing: boolean = !pkg[action];
debug('is unpublish method missing ? %s', isUnpublishMissing);
const hasGroups: boolean = isUnpublishMissing ? false : (pkg[action] as string[]).length > 0;
logger.trace(
{ user: user.name, name: pkg.name, hasGroups },

View File

@@ -1,47 +1,79 @@
import express from 'express';
import path from 'path';
import supertest from 'supertest';
import { Config as AppConfig, ROLES, getDefaultConfig } from '@verdaccio/config';
import { errorUtils } from '@verdaccio/core';
import { setup } from '@verdaccio/logger';
import { Config as AppConfig, ROLES, createRemoteUser, getDefaultConfig } from '@verdaccio/config';
import {
API_ERROR,
HEADERS,
HTTP_STATUS,
SUPPORT_ERRORS,
TOKEN_BEARER,
errorUtils,
} from '@verdaccio/core';
import { logger, setup } from '@verdaccio/logger';
import { errorReportingMiddleware, final, handleError } from '@verdaccio/middleware';
import { Config } from '@verdaccio/types';
import { buildToken } from '@verdaccio/utils';
import { Auth } from '../src';
import { authPluginFailureConf, authPluginPassThrougConf, authProfileConf } from './helper/plugin';
import { $RequestExtend, Auth } from '../src';
import {
authChangePasswordConf,
authPluginFailureConf,
authPluginPassThrougConf,
authProfileConf,
} from './helper/plugin';
setup({ level: 'debug', type: 'stdout' });
setup({});
// to avoid flaky test generate same ramdom key
jest.mock('@verdaccio/utils', () => {
return {
...jest.requireActual('@verdaccio/utils'),
// used by enhanced legacy aes signature (minimum 32 characters)
generateRandomSecretKey: () => 'GCYW/3IJzQI6GvPmy9sbMkFoiL7QLVw',
// used by legacy aes signature
generateRandomHexString: () =>
'ff065fcf7a8330ae37d3ea116328852f387ad7aa6defbe47fb68b1ea25f97446',
};
});
describe('AuthTest', () => {
test('should init correctly', async () => {
const config: Config = new AppConfig({ ...authProfileConf });
config.checkSecretKey('12345');
describe('default', () => {
test('should init correctly', async () => {
const config: Config = new AppConfig({ ...authProfileConf });
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
});
test('should load default auth plugin', async () => {
const config: Config = new AppConfig({ ...authProfileConf, auth: undefined });
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
});
test('should load custom algorithm', async () => {
const config: Config = new AppConfig({
...authProfileConf,
auth: { htpasswd: { algorithm: 'sha1', file: './foo' } },
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
});
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
test('should load default auth plugin', async () => {
const config: Config = new AppConfig({ ...authProfileConf, auth: undefined });
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
});
});
describe('test authenticate method', () => {
describe('utils', () => {
test('should load custom algorithm', async () => {
const config: Config = new AppConfig({
...authProfileConf,
auth: { htpasswd: { algorithm: 'sha1', file: './foo' } },
});
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
});
});
describe('authenticate', () => {
describe('test authenticate states', () => {
test('should be a success login', async () => {
const config: Config = new AppConfig({ ...authProfileConf });
@@ -163,30 +195,519 @@ describe('AuthTest', () => {
}
});
});
describe('test multiple authenticate methods', () => {
test('should skip falsy values', async () => {
const config: Config = new AppConfig({
...getDefaultConfig(),
plugins: path.join(__dirname, './partials/plugin'),
auth: {
success: {},
'fail-invalid-method': {},
},
});
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
return new Promise((resolve) => {
auth.authenticate('foo', 'bar', (err, value) => {
expect(value).toEqual({
name: 'foo',
groups: ['test', ROLES.$ALL, '$authenticated', '@all', '@authenticated', 'all'],
real_groups: ['test'],
});
resolve(value);
});
});
});
});
});
describe('test multiple authenticate methods', () => {
test('should skip falsy values', async () => {
describe('changePassword', () => {
test('should fail if the plugin does not provide implementation', async () => {
const config: Config = new AppConfig({ ...authProfileConf });
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
const callback = jest.fn();
auth.changePassword('foo', 'bar', 'newFoo', callback);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(
errorUtils.getInternalError(SUPPORT_ERRORS.PLUGIN_MISSING_INTERFACE)
);
});
test('should handle plugin does provide implementation', async () => {
const config: Config = new AppConfig({ ...authChangePasswordConf });
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
const callback = jest.fn();
auth.add_user('foo', 'bar', jest.fn());
auth.changePassword('foo', 'bar', 'newFoo', callback);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(null, true);
});
});
describe('allow_access', () => {
describe('no custom allow_access implementation provided', () => {
// when allow_access is not implemented, the groups must match
// exactly with the packages access group
test('should fails if groups do not match exactly', async () => {
const config: Config = new AppConfig({ ...authProfileConf });
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
const callback = jest.fn();
const groups = ['test'];
auth.allow_access(
{ packageName: 'foo' },
{ name: 'foo', groups, real_groups: groups },
callback
);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(
errorUtils.getForbidden('user foo is not allowed to access package foo')
);
});
test('should success if groups do not match exactly', async () => {
const config: Config = new AppConfig({ ...authProfileConf });
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
const callback = jest.fn();
// $all comes from configuration file
const groups = [ROLES.$ALL];
auth.allow_access(
{ packageName: 'foo' },
{ name: 'foo', groups, real_groups: groups },
callback
);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(null, true);
});
});
});
describe('allow_publish', () => {
describe('no custom allow_publish implementation provided', () => {
// when allow_access is not implemented, the groups must match
// exactly with the packages access group
test('should fails if groups do not match exactly', async () => {
const config: Config = new AppConfig({ ...authProfileConf });
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
const callback = jest.fn();
const groups = ['test'];
auth.allow_publish(
{ packageName: 'foo' },
{ name: 'foo', groups, real_groups: groups },
callback
);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(
errorUtils.getForbidden('user foo is not allowed to publish package foo')
);
});
test('should success if groups do match exactly', async () => {
const config: Config = new AppConfig({ ...authProfileConf });
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
const callback = jest.fn();
// $all comes from configuration file
const groups = [ROLES.$AUTH];
auth.allow_publish(
{ packageName: 'foo' },
{ name: 'foo', groups, real_groups: groups },
callback
);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(null, true);
});
});
});
describe('allow_unpublish', () => {
describe('no custom allow_unpublish implementation provided', () => {
test('should fails if groups do not match exactly', async () => {
const config: Config = new AppConfig({ ...authProfileConf });
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
const callback = jest.fn();
const groups = ['test'];
auth.allow_unpublish(
{ packageName: 'foo' },
{ name: 'foo', groups, real_groups: groups },
callback
);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(
errorUtils.getForbidden('user foo is not allowed to unpublish package foo')
);
});
test('should handle missing unpublish method (special case to handle legacy configurations)', async () => {
const config: Config = new AppConfig({
...authProfileConf,
packages: {
...authProfileConf.packages,
'**': {
access: ['$all'],
publish: ['$authenticated'],
// it forces publish handle the access
unpublish: undefined,
proxy: ['npmjs'],
},
},
});
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
const callback = jest.fn();
const groups = ['test'];
auth.allow_unpublish(
{ packageName: 'foo' },
{ name: 'foo', groups, real_groups: groups },
callback
);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(
errorUtils.getForbidden('user foo is not allowed to publish package foo')
);
});
test('should success if groups do match exactly', async () => {
const config: Config = new AppConfig({ ...authProfileConf });
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
const callback = jest.fn();
// $all comes from configuration file
const groups = [ROLES.$AUTH];
auth.allow_unpublish(
{ packageName: 'foo' },
{ name: 'foo', groups, real_groups: groups },
callback
);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(null, true);
});
});
});
describe('add_user', () => {
describe('error handling', () => {
// when allow_access is not implemented, the groups must match
// exactly with the packages access group
test('should fails with bad password if adduser is not implemented', async () => {
const config: Config = new AppConfig({ ...authProfileConf });
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
const callback = jest.fn();
auth.add_user('juan', 'password', callback);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(
errorUtils.getConflict(API_ERROR.BAD_USERNAME_PASSWORD)
);
});
test('should fails if adduser fails internally (exception)', async () => {
const config: Config = new AppConfig({
...getDefaultConfig(),
plugins: path.join(__dirname, './partials/plugin'),
auth: {
adduser: {},
},
});
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
const callback = jest.fn();
// note: fail uas username make plugin fails
auth.add_user('fail', 'password', callback);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(new Error('bad username'));
});
test('should skip to the next plugin and fails', async () => {
const config: Config = new AppConfig({
...getDefaultConfig(),
plugins: path.join(__dirname, './partials/plugin'),
auth: {
adduser: {},
// plugin implement adduser with fail auth
fail: {},
},
});
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
const callback = jest.fn();
// note: fail uas username make plugin fails
auth.add_user('skip', 'password', callback);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(
errorUtils.getConflict(API_ERROR.BAD_USERNAME_PASSWORD)
);
});
});
test('should success if adduser', async () => {
const config: Config = new AppConfig({
...getDefaultConfig(),
plugins: path.join(__dirname, './partials/plugin'),
auth: {
success: {},
'fail-invalid-method': {},
adduser: {},
},
});
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
return new Promise((resolve) => {
auth.authenticate('foo', 'bar', (err, value) => {
expect(value).toEqual({
name: 'foo',
groups: ['test', '$all', '$authenticated', '@all', '@authenticated', 'all'],
real_groups: ['test'],
const callback = jest.fn();
auth.add_user('something', 'password', callback);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(null, {
groups: ['test', '$all', '$authenticated', '@all', '@authenticated', 'all'],
name: 'something',
real_groups: ['test'],
});
});
test('should handle legacy add_user method', async () => {
const config: Config = new AppConfig({
...getDefaultConfig(),
plugins: path.join(__dirname, './partials/plugin'),
auth: {
'adduser-legacy': {},
},
});
config.checkSecretKey('12345');
const auth: Auth = new Auth(config);
await auth.init();
expect(auth).toBeDefined();
const callback = jest.fn();
auth.add_user('something', 'password', callback);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(null, {
groups: ['test', '$all', '$authenticated', '@all', '@authenticated', 'all'],
name: 'something',
real_groups: ['test'],
});
});
});
describe('middlewares', () => {
describe('apiJWTmiddleware', () => {
const secret = '12345';
const getServer = async function (auth) {
const app = express();
app.use(express.json({ strict: false, limit: '10mb' }));
// @ts-expect-error
app.use(errorReportingMiddleware(logger));
app.use(auth.apiJWTmiddleware());
app.get('/*', (req, res, next) => {
if ((req as $RequestExtend).remote_user.error) {
next(new Error((req as $RequestExtend).remote_user.error));
} else {
// @ts-expect-error
next({ user: req?.remote_user });
}
});
// @ts-expect-error
app.use(handleError(logger));
// @ts-expect-error
app.use(final);
return app;
};
describe('legacy signature', () => {
describe('error cases', () => {
test('should handle invalid auth token', async () => {
const config: Config = new AppConfig({ ...authProfileConf });
config.checkSecretKey(secret);
const auth = new Auth(config);
await auth.init();
const app = await getServer(auth);
return supertest(app)
.get(`/`)
.set(HEADERS.AUTHORIZATION, 'Bearer foo')
.expect(HTTP_STATUS.INTERNAL_ERROR);
});
test('should handle missing auth header', async () => {
const config: Config = new AppConfig({ ...authProfileConf });
config.checkSecretKey(secret);
const auth = new Auth(config);
await auth.init();
const app = await getServer(auth);
return supertest(app).get(`/`).expect(HTTP_STATUS.OK);
});
});
describe('deprecated legacy handling forceEnhancedLegacySignature=false', () => {
test('should handle valid auth token', async () => {
const payload = 'juan:password';
// const token = await signPayload(remoteUser, '12345');
const config: Config = new AppConfig(
{ ...authProfileConf },
{ forceEnhancedLegacySignature: false }
);
// intended to force key generator (associated with mocks above)
config.checkSecretKey(undefined);
const auth = new Auth(config);
await auth.init();
const token = auth.aesEncrypt(payload) as string;
const app = await getServer(auth);
const res = await supertest(app)
.get(`/`)
.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token))
.expect(HTTP_STATUS.OK);
expect(res.body.user.name).toEqual('juan');
});
test('should handle invalid auth token', async () => {
const payload = 'juan:password';
const config: Config = new AppConfig(
{ ...authPluginFailureConf },
{ forceEnhancedLegacySignature: false }
);
// intended to force key generator (associated with mocks above)
config.checkSecretKey(undefined);
const auth = new Auth(config);
await auth.init();
const token = auth.aesEncrypt(payload) as string;
const app = await getServer(auth);
return await supertest(app)
.get(`/`)
.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token))
.expect(HTTP_STATUS.INTERNAL_ERROR);
});
});
});
describe('jwt signature', () => {
describe('error cases', () => {
test('should handle invalid auth token and return anonymous', async () => {
// @ts-expect-error
const config: Config = new AppConfig({
...authProfileConf,
...{ security: { api: { jwt: { sign: { expiresIn: '29d' } } } } },
});
config.checkSecretKey(secret);
const auth = new Auth(config);
await auth.init();
const app = await getServer(auth);
const res = await supertest(app)
.get(`/`)
.set(HEADERS.AUTHORIZATION, 'Bearer foo')
.expect(HTTP_STATUS.OK);
expect(res.body.user.groups).toEqual([
ROLES.$ALL,
ROLES.$ANONYMOUS,
ROLES.DEPRECATED_ALL,
ROLES.DEPRECATED_ANONYMOUS,
]);
});
test('should handle missing auth header', async () => {
// @ts-expect-error
const config: Config = new AppConfig({
...authProfileConf,
...{ security: { api: { jwt: { sign: { expiresIn: '29d' } } } } },
});
config.checkSecretKey(secret);
const auth = new Auth(config);
await auth.init();
const app = await getServer(auth);
const res = await supertest(app).get(`/`).expect(HTTP_STATUS.OK);
expect(res.body.user.groups).toEqual([
ROLES.$ALL,
ROLES.$ANONYMOUS,
ROLES.DEPRECATED_ALL,
ROLES.DEPRECATED_ANONYMOUS,
]);
});
});
describe('valid signature handlers', () => {
test('should handle valid auth token', async () => {
const config: Config = new AppConfig(
// @ts-expect-error
{
...authProfileConf,
...{ security: { api: { jwt: { sign: { expiresIn: '29d' } } } } },
},
{ forceEnhancedLegacySignature: false }
);
// intended to force key generator (associated with mocks above)
config.checkSecretKey(undefined);
const auth = new Auth(config);
await auth.init();
const token = (await auth.jwtEncrypt(
createRemoteUser('jwt_user', [ROLES.ALL]),
// @ts-expect-error
config.security.api.jwt.sign
)) as string;
const app = await getServer(auth);
const res = await supertest(app)
.get(`/`)
.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token))
.expect(HTTP_STATUS.OK);
expect(res.body.user.name).toEqual('jwt_user');
});
resolve(value);
});
});
});

View File

@@ -10,6 +10,14 @@ export const authProfileConf = {
},
};
export const authChangePasswordConf = {
...getDefaultConfig(),
plugins: path.join(__dirname, '../partials/plugin'),
auth: {
'change-password': {},
},
};
export const authPluginFailureConf = {
...getDefaultConfig(),
plugins: path.join(__dirname, '../partials/plugin'),

View File

@@ -0,0 +1,9 @@
module.exports = function () {
return {
authenticate(user, pass, callback) {
// https://verdaccio.org/docs/en/dev-plugins#onsuccess
// this is a successful login and return a simple group
callback(null, ['test']);
},
};
};

View File

@@ -0,0 +1,5 @@
{
"name": "verdaccio-access-ok",
"main": "access.js",
"version": "1.0.0"
}

View File

@@ -0,0 +1,25 @@
module.exports = function () {
return {
authenticate(user, pass, callback) {
// https://verdaccio.org/docs/en/dev-plugins#onsuccess
// this is a successful login and return a simple group
callback(null, ['test']);
},
add_user(user, password, cb) {
if (user === 'fail') {
return cb(Error('bad username'));
}
if (user === 'password') {
return cb(Error('bad password'));
}
if (user === 'skip') {
// if wants to the next plugin
return cb(null, false);
}
cb(null, true);
},
};
};

View File

@@ -0,0 +1,5 @@
{
"name": "verdaccio-adduser-legacy",
"main": "adduser.js",
"version": "1.0.0"
}

View File

@@ -0,0 +1,25 @@
module.exports = function () {
return {
authenticate(user, pass, callback) {
// https://verdaccio.org/docs/en/dev-plugins#onsuccess
// this is a successful login and return a simple group
callback(null, ['test']);
},
adduser(user, password, cb) {
if (user === 'fail') {
return cb(Error('bad username'));
}
if (user === 'password') {
return cb(Error('bad password'));
}
if (user === 'skip') {
// if wants to the next plugin
return cb(null, false);
}
cb(null, true);
},
};
};

View File

@@ -0,0 +1,5 @@
{
"name": "verdaccio-adduser",
"main": "adduser.js",
"version": "1.0.0"
}

View File

@@ -0,0 +1,32 @@
module.exports = function () {
return {
users: [],
authenticate(user, pass, callback) {
// https://verdaccio.org/docs/en/dev-plugins#onsuccess
// this is a successful login and return a simple group
callback(null, ['test']);
},
changePassword(user, password, newPassword, cb) {
if (password === newPassword) {
return cb(Error('error password equal'));
}
return cb(null, true);
},
adduser(user, password, cb) {
if (user === 'fail') {
return cb(Error('bad username'));
}
if (user === 'password') {
return cb(Error('bad password'));
}
if (user === 'skip') {
// if wants to the next plugin
return cb(null, false);
}
cb(null, true);
},
};
};

View File

@@ -0,0 +1,5 @@
{
"name": "verdaccio-change-password",
"main": "change.js",
"version": "1.0.0"
}

View File

@@ -7,5 +7,8 @@ module.exports = function () {
and success types respectively for testing purposes */
callback(errorUtils.getInternalError(), false);
},
adduser(user, password, cb) {
return cb(null, false);
},
};
};

View File

@@ -1,5 +1,43 @@
# @verdaccio/cli
## 7.0.0-next-7.8
### Patch Changes
- @verdaccio/node-api@7.0.0-next-7.8
- @verdaccio/core@7.0.0-next-7.8
- @verdaccio/config@7.0.0-next-7.8
- @verdaccio/logger@7.0.0-next-7.8
## 7.0.0-next-7.7
### Patch Changes
- @verdaccio/core@7.0.0-next-7.7
- @verdaccio/config@7.0.0-next-7.7
- @verdaccio/node-api@7.0.0-next-7.7
- @verdaccio/logger@7.0.0-next-7.7
## 7.0.0-next.6
### Patch Changes
- Updated dependencies [4d96324]
- @verdaccio/config@7.0.0-next.6
- @verdaccio/node-api@7.0.0-next.6
- @verdaccio/core@7.0.0-next.6
- @verdaccio/logger@7.0.0-next.6
## 7.0.0-next.5
### Patch Changes
- Updated dependencies [f047cc8]
- @verdaccio/core@7.0.0-next.5
- @verdaccio/config@7.0.0-next.5
- @verdaccio/node-api@7.0.0-next.5
- @verdaccio/logger@7.0.0-next.5
## 7.0.0-next.4
### Patch Changes
@@ -178,12 +216,12 @@
- 8f43bf17d: feat: node api new structure based on promise
```js
import { runServer } from '@verdaccio/node-api';
import { runServer } from "@verdaccio/node-api";
// or
import { runServer } from 'verdaccio';
import { runServer } from "verdaccio";
const app = await runServer(); // default configuration
const app = await runServer('./config/config.yaml');
const app = await runServer("./config/config.yaml");
const app = await runServer({ configuration });
app.listen(4000, (event) => {
// do something
@@ -1029,14 +1067,14 @@
- 5c5057fc: feat: node api new structure based on promise
```js
import { runServer } from '@verdaccio/node-api';
import { runServer } from "@verdaccio/node-api";
// or
import { runServer } from 'verdaccio';
import { runServer } from "verdaccio";
const app = await runServer(); // default configuration
const app = await runServer('./config/config.yaml');
const app = await runServer("./config/config.yaml");
const app = await runServer({ configuration });
app.listen(4000, event => {
app.listen(4000, (event) => {
// do something
});
```

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/cli",
"version": "7.0.0-next.4",
"version": "7.0.0-next-7.8",
"author": {
"name": "Juan Picado",
"email": "juanpicado19@gmail.com"
@@ -43,17 +43,17 @@
"start": "ts-node src/index.ts"
},
"dependencies": {
"@verdaccio/core": "workspace:7.0.0-next.4",
"@verdaccio/config": "workspace:7.0.0-next.4",
"@verdaccio/logger": "workspace:7.0.0-next.4",
"@verdaccio/node-api": "workspace:7.0.0-next.4",
"@verdaccio/core": "workspace:7.0.0-next-7.8",
"@verdaccio/config": "workspace:7.0.0-next-7.8",
"@verdaccio/logger": "workspace:7.0.0-next-7.8",
"@verdaccio/node-api": "workspace:7.0.0-next-7.8",
"clipanion": "3.2.1",
"envinfo": "7.8.1",
"envinfo": "7.11.0",
"kleur": "4.1.5",
"semver": "7.5.4"
},
"devDependencies": {
"ts-node": "10.9.1"
"ts-node": "10.9.2"
},
"funding": {
"type": "opencollective",

View File

@@ -1,5 +1,39 @@
# @verdaccio/config
## 7.0.0-next-7.8
### Patch Changes
- @verdaccio/core@7.0.0-next-7.8
- @verdaccio/utils@7.0.0-next-7.8
## 7.0.0-next-7.7
### Patch Changes
- @verdaccio/core@7.0.0-next-7.7
- @verdaccio/utils@7.0.0-next-7.7
## 7.0.0-next.6
### Patch Changes
- 4d96324: chore(config): increase test coverage
- @verdaccio/core@7.0.0-next.6
- @verdaccio/utils@7.0.0-next.6
## 7.0.0-next.5
### Minor Changes
- f047cc8: refactor: auth with legacy sign support
### Patch Changes
- Updated dependencies [f047cc8]
- @verdaccio/core@7.0.0-next.5
- @verdaccio/utils@7.0.0-next.5
## 7.0.0-next.4
### Patch Changes
@@ -225,12 +259,12 @@
- 8f43bf17d: feat: node api new structure based on promise
```js
import { runServer } from '@verdaccio/node-api';
import { runServer } from "@verdaccio/node-api";
// or
import { runServer } from 'verdaccio';
import { runServer } from "verdaccio";
const app = await runServer(); // default configuration
const app = await runServer('./config/config.yaml');
const app = await runServer("./config/config.yaml");
const app = await runServer({ configuration });
app.listen(4000, (event) => {
// do something
@@ -1000,14 +1034,14 @@
- 5c5057fc: feat: node api new structure based on promise
```js
import { runServer } from '@verdaccio/node-api';
import { runServer } from "@verdaccio/node-api";
// or
import { runServer } from 'verdaccio';
import { runServer } from "verdaccio";
const app = await runServer(); // default configuration
const app = await runServer('./config/config.yaml');
const app = await runServer("./config/config.yaml");
const app = await runServer({ configuration });
app.listen(4000, event => {
app.listen(4000, (event) => {
// do something
});
```

View File

@@ -3,8 +3,7 @@ const config = require('../../jest/config');
module.exports = Object.assign({}, config, {
coverageThreshold: {
global: {
// FIXME: increase to 90
lines: 85,
lines: 90,
},
},
});

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/config",
"version": "7.0.0-next.4",
"version": "7.0.0-next-7.8",
"description": "logger",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -38,8 +38,8 @@
"build": "pnpm run build:js && pnpm run build:types"
},
"dependencies": {
"@verdaccio/core": "workspace:7.0.0-next.4",
"@verdaccio/utils": "workspace:7.0.0-next.4",
"@verdaccio/core": "workspace:7.0.0-next-7.8",
"@verdaccio/utils": "workspace:7.0.0-next-7.8",
"debug": "4.3.4",
"js-yaml": "4.1.0",
"lodash": "4.17.21",
@@ -48,7 +48,7 @@
},
"devDependencies": {
"@types/minimatch": "5.1.2",
"@types/yup": "0.29.14"
"@types/yup": "0.32.0"
},
"funding": {
"type": "opencollective",

View File

@@ -63,6 +63,10 @@ class Config implements AppConfig {
private configOptions: { forceEnhancedLegacySignature: boolean };
public constructor(
config: ConfigYaml & { config_path: string },
// forceEnhancedLegacySignature is a property that
// allows switch a new legacy aes signature token signature
// for older versions do not want to have this new signature model
// this property must be false
configOptions = { forceEnhancedLegacySignature: true }
) {
const self = this;
@@ -131,6 +135,16 @@ class Config implements AppConfig {
}
}
public getEnhancedLegacySignature() {
if (typeof this?.security.enhancedLegacySignature !== 'undefined') {
if (this.security.enhancedLegacySignature === true) {
return true;
}
return false;
}
return this.configOptions.forceEnhancedLegacySignature;
}
public getConfigPath() {
return this.configPath;
}
@@ -156,24 +170,23 @@ class Config implements AppConfig {
}
// generate a new a secret key
// FUTURE: this might be an external secret key, perhaps within config file?
debug('generate a new key');
//
if (this.configOptions.forceEnhancedLegacySignature) {
debug('generating a new secret key');
if (this.getEnhancedLegacySignature()) {
debug('key generated with "enhanced" legacy signature user config');
this.secret = generateRandomSecretKey();
} else {
this.secret =
this.security.enhancedLegacySignature === true
? generateRandomSecretKey()
: generateRandomHexString(32);
// set this to false allow use old token signature and is not recommended
// only use for migration reasons, major release will remove this property and
// set it by default
if (this.security.enhancedLegacySignature === false) {
warningUtils.emit(Codes.VERWAR005);
}
debug('key generated with legacy signature user config');
this.secret = generateRandomHexString(32);
}
// set this to false allow use old token signature and is not recommended
// only use for migration reasons, major release will remove this property and
// set it by default
if (this.security?.enhancedLegacySignature === false) {
warningUtils.emit(Codes.VERWAR005);
}
debug('generated a new secret key %s', this.secret?.length);
debug('generated a new secret key length %s', this.secret?.length);
return this.secret;
}
}

View File

@@ -27,7 +27,7 @@ export const PACKAGE_ACCESS = {
export function normalizeUserList(groupsList: any): any {
const result: any[] = [];
if (_.isNil(groupsList)) {
if (_.isNil(groupsList) || _.isEmpty(groupsList)) {
return result;
}

View File

@@ -0,0 +1,42 @@
import { getUserAgent } from '../src';
describe('getUserAgent', () => {
test('should return custom user agent when customUserAgent is true', () => {
const customUserAgent = true;
const version = '1.0.0';
const name = 'MyAgent';
const result = getUserAgent(customUserAgent, version, name);
expect(result).toBe('MyAgent/1.0.0');
});
test('should return custom user agent when customUserAgent is a non-empty string', () => {
const customUserAgent = 'CustomAgent/1.0.0';
const version = '1.0.0';
const name = 'MyAgent';
const result = getUserAgent(customUserAgent, version, name);
expect(result).toBe('CustomAgent/1.0.0');
});
test('should return "hidden" when customUserAgent is false', () => {
const customUserAgent = false;
const version = '1.0.0';
const name = 'MyAgent';
const result = getUserAgent(customUserAgent, version, name);
expect(result).toBe('hidden');
});
test('should return default user agent when customUserAgent is undefined', () => {
const version = '1.0.0';
const name = 'MyAgent';
const result = getUserAgent(undefined, version, name);
expect(result).toBe('MyAgent/1.0.0');
});
});

View File

@@ -13,6 +13,7 @@ describe('Config builder', () => {
proxy: 'some',
})
.addLogger({ level: 'info', type: 'stdout', format: 'json' })
.addAuth({ htpasswd: { file: '.htpasswd' } })
.addStorage('/tmp/verdaccio')
.addSecurity({ api: { legacy: true } });
expect(config.getConfig()).toEqual({
@@ -21,6 +22,11 @@ describe('Config builder', () => {
legacy: true,
},
},
auth: {
htpasswd: {
file: '.htpasswd',
},
},
storage: '/tmp/verdaccio',
packages: {
'upstream/*': {

View File

@@ -106,6 +106,20 @@ describe('checkSecretKey', () => {
const config = new Config(parseConfigFile(resolveConf('default')));
expect(typeof config.checkSecretKey('') === 'string').toBeTruthy();
});
test('with enhanced legacy signature', () => {
const config = new Config(parseConfigFile(resolveConf('default')));
config.security.enhancedLegacySignature = true;
expect(typeof config.checkSecretKey() === 'string').toBeTruthy();
expect(config.secret.length).toBe(32);
});
test('without enhanced legacy signature', () => {
const config = new Config(parseConfigFile(resolveConf('default')));
config.security.enhancedLegacySignature = false;
expect(typeof config.checkSecretKey() === 'string').toBeTruthy();
expect(config.secret.length).toBe(64);
});
});
describe('getMatchedPackagesSpec', () => {
@@ -159,3 +173,18 @@ describe('VERDACCIO_STORAGE_PATH', () => {
delete process.env.VERDACCIO_STORAGE_PATH;
});
});
describe('configPath', () => {
test('should set configPath in config', () => {
const defaultConfig = parseConfigFile(resolveConf('default'));
const config = new Config(defaultConfig);
expect(config.getConfigPath()).toBe(path.join(__dirname, '../src/conf/default.yaml'));
});
test('should throw an error if configPath is not provided', () => {
const defaultConfig = parseConfigFile(resolveConf('default'));
defaultConfig.configPath = '';
defaultConfig.config_path = '';
expect(() => new Config(defaultConfig)).toThrow('configPath property is required');
});
});

View File

@@ -1,7 +1,7 @@
import _ from 'lodash';
import { parseConfigFile } from '../src';
import { PACKAGE_ACCESS, normalisePackageAccess } from '../src/package-access';
import { PACKAGE_ACCESS, normalisePackageAccess, normalizeUserList } from '../src/package-access';
import { parseConfigurationFile } from './utils';
describe('Package access utilities', () => {
@@ -123,4 +123,30 @@ describe('Package access utilities', () => {
expect(_.isArray(all.publish)).toBeTruthy();
});
});
describe('normaliseUserList', () => {
test('should normalize user list', () => {
const groupsList = 'admin superadmin';
const result = normalizeUserList(groupsList);
expect(result).toEqual(['admin', 'superadmin']);
});
test('should normalize empty user list', () => {
const groupsList = '';
const result = normalizeUserList(groupsList);
expect(result).toEqual([]);
});
test('should normalize user list array', () => {
const groupsList = ['admin', 'superadmin'];
const result = normalizeUserList(groupsList);
expect(result).toEqual(['admin', 'superadmin']);
});
test('should throw error for invalid user list', () => {
const groupsList = { group: 'admin' };
expect(() => {
normalizeUserList(groupsList);
}).toThrow('CONFIG: bad package acl (array or string expected): {"group":"admin"}');
});
});
});

View File

@@ -1,5 +1,17 @@
# @verdaccio/core
## 7.0.0-next-7.8
## 7.0.0-next-7.7
## 7.0.0-next.6
## 7.0.0-next.5
### Minor Changes
- f047cc8: refactor: auth with legacy sign support
## 7.0.0-next.4
## 7.0.0-next.3

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/core",
"version": "7.0.0-next.4",
"version": "7.0.0-next-7.8",
"description": "core utilities",
"keywords": [
"private",
@@ -34,17 +34,17 @@
},
"dependencies": {
"http-errors": "2.0.0",
"http-status-codes": "2.2.0",
"http-status-codes": "2.3.0",
"semver": "7.5.4",
"ajv": "8.12.0",
"process-warning": "1.0.0",
"core-js": "3.30.2"
"core-js": "3.35.0"
},
"devDependencies": {
"lodash": "4.17.21",
"typedoc": "0.23.25",
"typedoc-plugin-missing-exports": "latest",
"@verdaccio/types": "workspace:12.0.0-next.1"
"@verdaccio/types": "workspace:12.0.0-next.2"
},
"scripts": {
"clean": "rimraf ./build",

View File

@@ -12,6 +12,7 @@ export enum Codes {
VERWAR005 = 'VERWAR005',
// deprecation warnings
VERDEP003 = 'VERDEP003',
VERWAR006 = 'VERWAR006',
}
warningInstance.create(
@@ -52,6 +53,12 @@ warningInstance.create(
'multiple addresses will be deprecated in the next major, only use one'
);
warningInstance.create(
verdaccioDeprecation,
Codes.VERWAR006,
'the auth plugin method "add_user" in the auth plugin is deprecated and will be removed in next major release, rename to "adduser"'
);
export function emit(code: string, a?: string, b?: string, c?: string) {
warningInstance.emit(code, a, b, c);
}

View File

@@ -39,7 +39,7 @@
"lockfile": "1.0.4"
},
"devDependencies": {
"@verdaccio/types": "workspace:12.0.0-next.1"
"@verdaccio/types": "workspace:12.0.0-next.2"
},
"scripts": {
"clean": "rimraf ./build",

View File

@@ -1,5 +1,40 @@
# Change Log
## 12.0.0-next-7.8
### Patch Changes
- @verdaccio/core@7.0.0-next-7.8
- @verdaccio/url@12.0.0-next-7.8
- @verdaccio/utils@7.0.0-next-7.8
## 12.0.0-next-7.7
### Patch Changes
- @verdaccio/core@7.0.0-next-7.7
- @verdaccio/url@12.0.0-next-7.7
- @verdaccio/utils@7.0.0-next-7.7
## 12.0.0-next.6
### Patch Changes
- e14b064: - Fixes polynomial regular expression when determining the file name of tarball
- Add tests for extracting tarball name
- @verdaccio/core@7.0.0-next.6
- @verdaccio/url@12.0.0-next.6
- @verdaccio/utils@7.0.0-next.6
## 12.0.0-next.5
### Patch Changes
- Updated dependencies [f047cc8]
- @verdaccio/core@7.0.0-next.5
- @verdaccio/url@12.0.0-next.5
- @verdaccio/utils@7.0.0-next.5
## 12.0.0-next.4
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/tarball",
"version": "12.0.0-next.4",
"version": "12.0.0-next-7.8",
"description": "tarball utilities resolver",
"keywords": [
"private",
@@ -34,14 +34,14 @@
},
"dependencies": {
"debug": "4.3.4",
"@verdaccio/core": "workspace:7.0.0-next.4",
"@verdaccio/url": "workspace:12.0.0-next.4",
"@verdaccio/utils": "workspace:7.0.0-next.4",
"@verdaccio/core": "workspace:7.0.0-next-7.8",
"@verdaccio/url": "workspace:12.0.0-next-7.8",
"@verdaccio/utils": "workspace:7.0.0-next-7.8",
"lodash": "4.17.21"
},
"devDependencies": {
"@verdaccio/types": "workspace:12.0.0-next.1",
"node-mocks-http": "1.13.0"
"@verdaccio/types": "workspace:12.0.0-next.2",
"node-mocks-http": "1.14.1"
},
"scripts": {
"clean": "rimraf ./build",

View File

@@ -4,6 +4,6 @@ export {
convertDistRemoteToLocalTarballUrls,
convertDistVersionToLocalTarballsUrl,
} from './convertDistRemoteToLocalTarballUrls';
export { getLocalRegistryTarballUri } from './getLocalRegistryTarballUri';
export { extractTarballFromUrl, getLocalRegistryTarballUri } from './getLocalRegistryTarballUri';
export { RequestOptions };

View File

@@ -0,0 +1,36 @@
import { extractTarballFromUrl } from '../src';
describe('extractTarballFromUrl', () => {
const metadata: any = {
name: 'npm_test',
versions: {
'1.0.0': {
dist: {
tarball: 'http://registry.org/npm_test/-/npm_test-1.0.0.tgz',
},
},
'1.0.1': {
dist: {
tarball: 'npm_test-1.0.1.tgz',
},
},
'1.0.2': {
dist: {
tarball: 'https://localhost/npm_test-1.0.2.tgz',
},
},
},
};
test('should return only name of tarball', () => {
expect(extractTarballFromUrl(metadata.versions['1.0.0'].dist.tarball)).toEqual(
'npm_test-1.0.0.tgz'
);
expect(extractTarballFromUrl(metadata.versions['1.0.1'].dist.tarball)).toEqual(
'npm_test-1.0.1.tgz'
);
expect(extractTarballFromUrl(metadata.versions['1.0.2'].dist.tarball)).toEqual(
'npm_test-1.0.2.tgz'
);
});
});

View File

@@ -1,5 +1,11 @@
# Change Log
## 12.0.0-next.2
### Minor Changes
- f047cc8: refactor: auth with legacy sign support
## 12.0.0-next.1
### Major Changes
@@ -211,12 +217,12 @@
- 8f43bf17d: feat: node api new structure based on promise
```js
import { runServer } from '@verdaccio/node-api';
import { runServer } from "@verdaccio/node-api";
// or
import { runServer } from 'verdaccio';
import { runServer } from "verdaccio";
const app = await runServer(); // default configuration
const app = await runServer('./config/config.yaml');
const app = await runServer("./config/config.yaml");
const app = await runServer({ configuration });
app.listen(4000, (event) => {
// do something
@@ -808,14 +814,14 @@
- 5c5057fc: feat: node api new structure based on promise
```js
import { runServer } from '@verdaccio/node-api';
import { runServer } from "@verdaccio/node-api";
// or
import { runServer } from 'verdaccio';
import { runServer } from "verdaccio";
const app = await runServer(); // default configuration
const app = await runServer('./config/config.yaml');
const app = await runServer("./config/config.yaml");
const app = await runServer({ configuration });
app.listen(4000, event => {
app.listen(4000, (event) => {
// do something
});
```

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/types",
"version": "12.0.0-next.1",
"version": "12.0.0-next.2",
"description": "verdaccio types definitions",
"keywords": [
"private",

View File

@@ -296,7 +296,7 @@ export interface Config extends Omit<ConfigYaml, 'packages' | 'security' | 'conf
// security object defaults is added by the config file but optional in the yaml file
security: Security;
// @deprecated (pending adding the replacement)
checkSecretKey(token: string): string;
checkSecretKey(token: string | void): string;
getMatchedPackagesSpec(storage: string): PackageAccess | void;
// TODO: verify how to handle this in the future
[key: string]: any;

View File

@@ -1,5 +1,34 @@
# Change Log
## 12.0.0-next-7.8
### Patch Changes
- @verdaccio/core@7.0.0-next-7.8
## 12.0.0-next-7.7
### Patch Changes
- @verdaccio/core@7.0.0-next-7.7
## 12.0.0-next.6
### Patch Changes
- @verdaccio/core@7.0.0-next.6
## 12.0.0-next.5
### Minor Changes
- f047cc8: refactor: auth with legacy sign support
### Patch Changes
- Updated dependencies [f047cc8]
- @verdaccio/core@7.0.0-next.5
## 12.0.0-next.4
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/url",
"version": "12.0.0-next.4",
"version": "12.0.0-next-7.8",
"description": "url utilities resolver",
"keywords": [
"private",
@@ -33,14 +33,14 @@
"access": "public"
},
"dependencies": {
"@verdaccio/core": "workspace:7.0.0-next.4",
"@verdaccio/core": "workspace:7.0.0-next-7.8",
"debug": "4.3.4",
"lodash": "4.17.21",
"validator": "13.9.0"
"validator": "13.11.0"
},
"devDependencies": {
"@verdaccio/types": "workspace:12.0.0-next.1",
"node-mocks-http": "1.13.0"
"@verdaccio/types": "workspace:12.0.0-next.2",
"node-mocks-http": "1.14.1"
},
"scripts": {
"clean": "rimraf ./build",

View File

@@ -1,6 +1,6 @@
import buildDebug from 'debug';
import { URL } from 'url';
import isURLValidator from 'validator/lib/isURL';
import validator from 'validator';
import { HEADERS } from '@verdaccio/core';
@@ -17,7 +17,7 @@ export function isURLhasValidProtocol(uri: string): boolean {
}
export function isHost(url: string = '', options = {}): boolean {
return isURLValidator(url, {
return validator.isURL(url, {
require_host: true,
allow_trailing_dot: false,
require_valid_protocol: false,
@@ -130,3 +130,5 @@ export function getPublicUrl(url_prefix: string = '', requestOptions: RequestOpt
return '/';
}
}
export const isURL = validator.isURL;

View File

@@ -1,5 +1,34 @@
# @verdaccio/hooks
## 7.0.0-next-7.8
### Patch Changes
- @verdaccio/core@7.0.0-next-7.8
- @verdaccio/logger@7.0.0-next-7.8
## 7.0.0-next-7.7
### Patch Changes
- @verdaccio/core@7.0.0-next-7.7
- @verdaccio/logger@7.0.0-next-7.7
## 7.0.0-next.6
### Patch Changes
- @verdaccio/core@7.0.0-next.6
- @verdaccio/logger@7.0.0-next.6
## 7.0.0-next.5
### Patch Changes
- Updated dependencies [f047cc8]
- @verdaccio/core@7.0.0-next.5
- @verdaccio/logger@7.0.0-next.5
## 7.0.0-next.4
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/hooks",
"version": "7.0.0-next.4",
"version": "7.0.0-next-7.8",
"description": "loaders logic",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -29,18 +29,18 @@
"node": ">=18"
},
"dependencies": {
"@verdaccio/core": "workspace:7.0.0-next.4",
"@verdaccio/logger": "workspace:7.0.0-next.4",
"core-js": "3.30.2",
"@verdaccio/core": "workspace:7.0.0-next-7.8",
"@verdaccio/logger": "workspace:7.0.0-next-7.8",
"core-js": "3.35.0",
"debug": "4.3.4",
"got-cjs": "12.5.4",
"handlebars": "4.7.7"
"handlebars": "4.7.8"
},
"devDependencies": {
"@verdaccio/auth": "workspace:7.0.0-next.4",
"@verdaccio/config": "workspace:7.0.0-next.4",
"@verdaccio/types": "workspace:12.0.0-next.1",
"nock": "13.3.3"
"@verdaccio/auth": "workspace:7.0.0-next-7.8",
"@verdaccio/config": "workspace:7.0.0-next-7.8",
"@verdaccio/types": "workspace:12.0.0-next.2",
"nock": "13.5.1"
},
"scripts": {
"clean": "rimraf ./build",

View File

@@ -1,5 +1,29 @@
# @verdaccio/loaders
## 7.0.0-next-7.8
### Patch Changes
- @verdaccio/logger@7.0.0-next-7.8
## 7.0.0-next-7.7
### Patch Changes
- @verdaccio/logger@7.0.0-next-7.7
## 7.0.0-next.6
### Patch Changes
- @verdaccio/logger@7.0.0-next.6
## 7.0.0-next.5
### Patch Changes
- @verdaccio/logger@7.0.0-next.5
## 7.0.0-next.4
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/loaders",
"version": "7.0.0-next.4",
"version": "7.0.0-next-7.8",
"description": "loaders logic",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -13,14 +13,14 @@
"url": "https://github.com/verdaccio/verdaccio"
},
"dependencies": {
"@verdaccio/logger": "workspace:7.0.0-next.4",
"@verdaccio/logger": "workspace:7.0.0-next-7.8",
"debug": "4.3.4",
"lodash": "4.17.21"
},
"devDependencies": {
"@verdaccio/core": "workspace:7.0.0-next.4",
"@verdaccio/config": "workspace:7.0.0-next.4",
"@verdaccio/types": "workspace:12.0.0-next.1",
"@verdaccio/core": "workspace:7.0.0-next-7.8",
"@verdaccio/config": "workspace:7.0.0-next-7.8",
"@verdaccio/types": "workspace:12.0.0-next.2",
"@verdaccio-scope/verdaccio-auth-foo": "0.0.2",
"verdaccio-auth-memory": "workspace:*",
"customprefix-auth": "2.0.0-next.0"

View File

@@ -1,5 +1,29 @@
# @verdaccio/logger-7
## 7.0.0-next-7.8
### Patch Changes
- @verdaccio/logger-commons@7.0.0-next-7.8
## 7.0.0-next-7.7
### Patch Changes
- @verdaccio/logger-commons@7.0.0-next-7.7
## 7.0.0-next.6
### Patch Changes
- @verdaccio/logger-commons@7.0.0-next.6
## 7.0.0-next.5
### Patch Changes
- @verdaccio/logger-commons@7.0.0-next.5
## 7.0.0-next.4
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/logger-7",
"version": "7.0.0-next.4",
"version": "7.0.0-next-7.8",
"description": "logger for verdaccio 5.x version",
"main": "./build/index.js",
"types": "./build/index.d.ts",
@@ -38,11 +38,11 @@
"build": "pnpm run build:js && pnpm run build:types"
},
"dependencies": {
"@verdaccio/logger-commons": "workspace:7.0.0-next.4",
"@verdaccio/logger-commons": "workspace:7.0.0-next-7.8",
"pino": "7.11.0"
},
"devDependencies": {
"@verdaccio/types": "workspace:12.0.0-next.1"
"@verdaccio/types": "workspace:12.0.0-next.2"
},
"funding": {
"type": "opencollective",

View File

@@ -1,5 +1,30 @@
# @verdaccio/logger-commons
## 7.0.0-next-7.8
### Patch Changes
- @verdaccio/core@7.0.0-next-7.8
## 7.0.0-next-7.7
### Patch Changes
- @verdaccio/core@7.0.0-next-7.7
## 7.0.0-next.6
### Patch Changes
- @verdaccio/core@7.0.0-next.6
## 7.0.0-next.5
### Patch Changes
- Updated dependencies [f047cc8]
- @verdaccio/core@7.0.0-next.5
## 7.0.0-next.4
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/logger-commons",
"version": "7.0.0-next.4",
"version": "7.0.0-next-7.8",
"description": "logger",
"main": "./build/index.js",
"types": "./build/index.d.ts",
@@ -38,14 +38,14 @@
"build": "pnpm run build:js && pnpm run build:types"
},
"dependencies": {
"@verdaccio/core": "workspace:7.0.0-next.4",
"@verdaccio/core": "workspace:7.0.0-next-7.8",
"@verdaccio/logger-prettify": "workspace:7.0.0-next.1",
"debug": "4.3.4",
"colorette": "2.0.20"
},
"devDependencies": {
"pino": "7.11.0",
"@verdaccio/types": "workspace:12.0.0-next.1"
"@verdaccio/types": "workspace:12.0.0-next.2"
},
"funding": {
"type": "opencollective",

View File

@@ -38,14 +38,14 @@
"build": "pnpm run build:js && pnpm run build:types"
},
"dependencies": {
"dayjs": "1.11.7",
"pino-abstract-transport": "1.0.0",
"dayjs": "1.11.10",
"pino-abstract-transport": "1.1.0",
"colorette": "2.0.20",
"lodash": "4.17.21",
"sonic-boom": "3.3.0"
"sonic-boom": "3.8.0"
},
"devDependencies": {
"pino": "8.12.1"
"pino": "8.17.2"
},
"funding": {
"type": "opencollective",

View File

@@ -1,5 +1,29 @@
# @verdaccio/logger
## 7.0.0-next-7.8
### Patch Changes
- @verdaccio/logger-commons@7.0.0-next-7.8
## 7.0.0-next-7.7
### Patch Changes
- @verdaccio/logger-commons@7.0.0-next-7.7
## 7.0.0-next.6
### Patch Changes
- @verdaccio/logger-commons@7.0.0-next.6
## 7.0.0-next.5
### Patch Changes
- @verdaccio/logger-commons@7.0.0-next.5
## 7.0.0-next.4
### Patch Changes
@@ -135,12 +159,12 @@
- 8f43bf17d: feat: node api new structure based on promise
```js
import { runServer } from '@verdaccio/node-api';
import { runServer } from "@verdaccio/node-api";
// or
import { runServer } from 'verdaccio';
import { runServer } from "verdaccio";
const app = await runServer(); // default configuration
const app = await runServer('./config/config.yaml');
const app = await runServer("./config/config.yaml");
const app = await runServer({ configuration });
app.listen(4000, (event) => {
// do something
@@ -552,14 +576,14 @@
- 5c5057fc: feat: node api new structure based on promise
```js
import { runServer } from '@verdaccio/node-api';
import { runServer } from "@verdaccio/node-api";
// or
import { runServer } from 'verdaccio';
import { runServer } from "verdaccio";
const app = await runServer(); // default configuration
const app = await runServer('./config/config.yaml');
const app = await runServer("./config/config.yaml");
const app = await runServer({ configuration });
app.listen(4000, event => {
app.listen(4000, (event) => {
// do something
});
```

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/logger",
"version": "7.0.0-next.4",
"version": "7.0.0-next-7.8",
"description": "logger",
"main": "./build/index.js",
"types": "./build/index.d.ts",
@@ -38,11 +38,11 @@
"build": "pnpm run build:js && pnpm run build:types"
},
"dependencies": {
"@verdaccio/logger-commons": "workspace:7.0.0-next.4",
"pino": "8.14.1"
"@verdaccio/logger-commons": "workspace:7.0.0-next-7.8",
"pino": "8.17.2"
},
"devDependencies": {
"@verdaccio/types": "workspace:12.0.0-next.1"
"@verdaccio/types": "workspace:12.0.0-next.2"
},
"funding": {
"type": "opencollective",

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