Upload Kmake

This commit is contained in:
Gorochu
2026-05-26 23:36:42 -07:00
parent ba051b2f74
commit 555ec72358
41615 changed files with 13344630 additions and 1 deletions

View File

@ -0,0 +1,59 @@
const { relative, dirname } = require('node:path')
// normalize line endings (for ini)
const cleanNewlines = (s) => s.replace(/\r\n/g, '\n')
// XXX: this also cleans quoted " in json snapshots
// ideally this could be avoided but its easier to just
// run this command inside cleanSnapshot
const normalizePath = (str) => cleanNewlines(str)
.replace(/[A-z]:\\/g, '\\') // turn windows roots to posix ones
.replace(/\\+/g, '/') // replace \ with /
const pathRegex = (p) => new RegExp(normalizePath(p), 'gi')
// create a cwd replacer in the module scope, since some tests
// overwrite process.cwd()
const CWD = pathRegex(process.cwd())
const TESTDIR = pathRegex(relative(process.cwd(), dirname(require.main.filename)))
const cleanCwd = (path) => normalizePath(path)
// repalce CWD, TESTDIR, and TAPDIR separately
.replace(CWD, '{CWD}')
.replace(TESTDIR, '{TESTDIR}')
.replace(/tap-testdir-[\w-.]+/gi, '{TAPDIR}')
// if everything ended up in line, reduce it all to CWD
.replace(/\{CWD\}\/\{TESTDIR\}\/\{TAPDIR\}/g, '{CWD}')
// replace for platform differences in global nodemodules
.replace(/lib\/node_modules/g, 'node_modules')
.replace(/global\/lib/g, 'global')
const cleanDate = (str) =>
str.replace(/\d{4}-\d{2}-\d{2}T\d{2}[_:]\d{2}[_:]\d{2}[_:.]\d{3}Z/g, '{DATE}')
const cleanTime = str => str.replace(/in [0-9]+m?s\s*$/gm, 'in {TIME}')
const cleanZlib = str => str
.replace(/shasum:( *)[0-9a-f]{40}/g, 'shasum:$1{sha}')
.replace(/integrity:( *).*/g, 'integrity:$1{integrity}')
.replace(/package size:( *)[0-9 A-Z]*/g, 'package size:$1{size}')
.replace(/"shasum": "[0-9a-f]{40}",/g, '"shasum": "{sha}",')
.replace(/"integrity": ".*",/g, '"integrity": "{integrity}",')
.replace(/"size": [0-9]*,/g, '"size": "{size}",')
const cleanPackumentCache = str => str
.replace(/heap:[0-9]*/g, 'heap:{heap}')
.replace(/maxSize:[0-9]*/g, 'maxSize:{maxSize}')
.replace(/maxEntrySize:[0-9]*/g, 'maxEntrySize:{maxEntrySize}')
module.exports = {
cleanCwd,
cleanDate,
cleanNewlines,
cleanTime,
cleanZlib,
cleanPackumentCache,
normalizePath,
pathRegex,
}

View File

@ -0,0 +1,559 @@
// some real-world examples of ERESOLVE error explanation objects,
// copied from arborist or generated there.
module.exports = {
cycleNested: {
code: 'ERESOLVE',
edge: {
type: 'peer',
name: '@isaacs/peer-dep-cycle-b',
spec: '1',
from: {
name: '@isaacs/peer-dep-cycle-a',
version: '1.0.0',
location: 'node_modules/@isaacs/peer-dep-cycle-a',
dependents: [
{
type: 'prod',
name: '@isaacs/peer-dep-cycle-a',
spec: '1.x',
from: { location: '/some/project' },
},
],
},
},
current: {
name: '@isaacs/peer-dep-cycle-c',
version: '2.0.0',
location: 'node_modules/@isaacs/peer-dep-cycle-c',
dependents: [
{
type: 'prod',
name: '@isaacs/peer-dep-cycle-c',
spec: '2.x',
from: { location: '/some/project' },
},
],
},
peerConflict: {
peer: {
name: '@isaacs/peer-dep-cycle-c',
version: '1.0.0',
whileInstalling: { name: '@isaacs/peer-dep-cycle-a', version: '1.0.0' },
location: 'node_modules/@isaacs/peer-dep-cycle-c',
dependents: [
{
type: 'peer',
name: '@isaacs/peer-dep-cycle-c',
spec: '1',
from: {
name: '@isaacs/peer-dep-cycle-b',
version: '1.0.0',
whileInstalling: { name: '@isaacs/peer-dep-cycle-a', version: '1.0.0' },
location: 'node_modules/@isaacs/peer-dep-cycle-b',
dependents: [
{
type: 'peer',
name: '@isaacs/peer-dep-cycle-b',
spec: '1',
from: {
name: '@isaacs/peer-dep-cycle-a',
version: '1.0.0',
location: 'node_modules/@isaacs/peer-dep-cycle-a',
dependents: [
{
type: 'prod',
name: '@isaacs/peer-dep-cycle-a',
spec: '1.x',
from: { location: '/some/project' },
},
],
},
},
],
},
},
],
},
},
strictPeerDeps: true,
},
withShrinkwrap: {
code: 'ERESOLVE',
edge: {
type: 'peer',
name: '@isaacs/peer-dep-cycle-c',
spec: '1',
error: 'INVALID',
from: {
name: '@isaacs/peer-dep-cycle-b',
version: '1.0.0',
location: 'node_modules/@isaacs/peer-dep-cycle-b',
whileInstalling: { name: '@isaacs/peer-dep-cycle-b', version: '1.0.0' },
dependents: [
{
type: 'peer',
name: '@isaacs/peer-dep-cycle-b',
spec: '1',
from: {
name: '@isaacs/peer-dep-cycle-a',
version: '1.0.0',
location: 'node_modules/@isaacs/peer-dep-cycle-a',
dependents: [
{
type: 'prod',
name: '@isaacs/peer-dep-cycle-a',
spec: '1.x',
from: { location: '/some/project' },
},
],
},
},
],
},
},
current: {
name: '@isaacs/peer-dep-cycle-c',
version: '2.0.0',
location: 'node_modules/@isaacs/peer-dep-cycle-c',
dependents: [
{
type: 'prod',
name: '@isaacs/peer-dep-cycle-c',
spec: '2.x',
from: { location: '/some/project' },
},
],
},
strictPeerDeps: true,
},
'chain-conflict': {
code: 'ERESOLVE',
current: {
name: '@isaacs/testing-peer-dep-conflict-chain-d',
version: '2.0.0',
whileInstalling: {
name: 'project',
version: '1.2.3',
path: '/some/project',
},
location: 'node_modules/@isaacs/testing-peer-dep-conflict-chain-d',
dependents: [
{
type: 'prod',
name: '@isaacs/testing-peer-dep-conflict-chain-d',
spec: '2',
from: { location: '/some/project' },
},
],
},
edge: {
type: 'peer',
name: '@isaacs/testing-peer-dep-conflict-chain-d',
spec: '1',
error: 'INVALID',
from: {
name: '@isaacs/testing-peer-dep-conflict-chain-c',
version: '1.0.0',
whileInstalling: {
name: 'project',
version: '1.2.3',
path: '/some/project',
},
location: 'node_modules/@isaacs/testing-peer-dep-conflict-chain-c',
dependents: [
{
type: 'prod',
name: '@isaacs/testing-peer-dep-conflict-chain-c',
spec: '1',
from: { location: '/some/project' },
},
],
},
},
peerConflict: null,
strictPeerDeps: false,
},
gatsby: {
code: 'ERESOLVE',
current: {
name: 'ink',
version: '3.0.0-7',
whileInstalling: {
name: 'gatsby-recipes',
version: '0.2.31',
path: '/some/project/node_modules/gatsby-recipes',
},
location: 'node_modules/ink',
dependents: [
{
type: 'dev',
name: 'ink',
spec: 'next',
from: {
name: 'gatsby-recipes',
version: '0.2.31',
location: 'node_modules/gatsby-recipes',
dependents: [
{
type: 'prod',
name: 'gatsby-recipes',
spec: '^0.2.31',
from: {
name: 'gatsby-cli',
version: '2.12.107',
location: 'node_modules/gatsby-cli',
dependents: [
{
type: 'prod',
name: 'gatsby-cli',
spec: '^2.12.107',
from: {
name: 'gatsby',
version: '2.24.74',
location: 'node_modules/gatsby',
dependents: [
{
type: 'prod',
name: 'gatsby',
spec: '',
from: {
location: '/some/project/gatsby-user',
},
},
],
},
},
],
},
},
],
},
},
],
},
edge: {
type: 'peer',
name: 'ink',
spec: '>=2.0.0',
error: 'INVALID',
from: {
name: 'ink-box',
version: '1.0.0',
whileInstalling: {
name: 'gatsby-recipes',
version: '0.2.31',
path: '/some/project/gatsby-user/node_modules/gatsby-recipes',
},
location: 'node_modules/ink-box',
dependents: [
{
type: 'prod',
name: 'ink-box',
spec: '^1.0.0',
from: {
name: 'gatsby-recipes',
version: '0.2.31',
location: 'node_modules/gatsby-recipes',
dependents: [
{
type: 'prod',
name: 'gatsby-recipes',
spec: '^0.2.31',
from: {
name: 'gatsby-cli',
version: '2.12.107',
location: 'node_modules/gatsby-cli',
dependents: [
{
type: 'prod',
name: 'gatsby-cli',
spec: '^2.12.107',
from: {
name: 'gatsby',
version: '2.24.74',
location: 'node_modules/gatsby',
dependents: [
{
type: 'prod',
name: 'gatsby',
spec: '',
from: {
location: '/some/project/gatsby-user',
},
},
],
},
},
],
},
},
],
},
},
],
},
},
peerConflict: null,
strictPeerDeps: true,
},
'no current node, but has current edge': {
code: 'ERESOLVE',
current: null,
currentEdge: {
type: 'dev',
name: 'eslint',
spec: 'file:.',
error: 'MISSING',
from: {
location: '/some/projects/eslint',
},
},
edge: {
type: 'peer',
name: 'eslint',
spec: '^6.0.0',
error: 'MISSING',
from: {
name: 'eslint-plugin-jsdoc',
version: '22.2.0',
whileInstalling: {
name: 'eslint',
version: '7.22.0',
path: '/Users/isaacs/dev/npm/cli/eslint',
},
location: 'node_modules/eslint-plugin-jsdoc',
dependents: [
{
type: 'dev',
name: 'eslint-plugin-jsdoc',
spec: '^22.1.0',
from: {
location: '/some/projects/eslint',
},
},
],
},
},
peerConflict: null,
strictPeerDeps: false,
force: false,
},
'no current node, no current edge, idk': {
code: 'ERESOLVE',
current: null,
edge: {
type: 'peer',
name: 'eslint',
spec: '^6.0.0',
error: 'MISSING',
from: {
name: 'eslint-plugin-jsdoc',
version: '22.2.0',
whileInstalling: {
name: 'eslint',
version: '7.22.0',
path: '/Users/isaacs/dev/npm/cli/eslint',
},
location: 'node_modules/eslint-plugin-jsdoc',
dependents: [
{
type: 'dev',
name: 'eslint-plugin-jsdoc',
spec: '^22.1.0',
from: {
location: '/some/projects/eslint',
},
},
],
},
},
peerConflict: null,
strictPeerDeps: false,
force: false,
},
'eslint-plugin case': {
code: 'ERESOLVE',
edge: {
type: 'dev',
name: 'eslint-plugin-eslint-plugin',
spec: '^3.1.0',
error: 'MISSING',
from: {
location: '/Users/isaacs/dev/npm/arborist/fixtures/eslint-plugin-react',
},
},
dep: {
name: 'eslint-plugin-eslint-plugin',
version: '3.5.1',
whileInstalling: {
name: 'eslint-plugin-react',
version: '7.24.0',
path: '/Users/isaacs/dev/npm/arborist/fixtures/eslint-plugin-react',
},
location: 'node_modules/eslint-plugin-eslint-plugin',
isWorkspace: false,
dependents: [
{
type: 'dev',
name: 'eslint-plugin-eslint-plugin',
spec: '^3.1.0',
error: 'MISSING',
from: {
location: '/Users/isaacs/dev/npm/arborist/fixtures/eslint-plugin-react',
},
},
],
},
current: null,
peerConflict: {
current: {
name: 'eslint',
version: '6.8.0',
location: 'node_modules/eslint',
isWorkspace: false,
dependents: [
{
type: 'dev',
name: 'eslint',
spec: '^3 || ^4 || ^5 || ^6 || ^7',
from: {
location: '/Users/isaacs/dev/npm/arborist/fixtures/eslint-plugin-react',
},
},
{
type: 'peer',
name: 'eslint',
spec: '^5.0.0 || ^6.0.0',
from: {
name: '@typescript-eslint/parser',
version: '2.34.0',
location: 'node_modules/@typescript-eslint/parser',
isWorkspace: false,
dependents: [
{
type: 'dev',
name: '@typescript-eslint/parser',
spec: '^2.34.0',
from: {
location: '/Users/isaacs/dev/npm/arborist/fixtures/eslint-plugin-react',
},
},
],
},
},
{
type: 'peer',
name: 'eslint',
spec: '^5.16.0 || ^6.8.0 || ^7.2.0',
from: {
name: 'eslint-config-airbnb-base',
version: '14.2.1',
location: 'node_modules/eslint-config-airbnb-base',
isWorkspace: false,
dependents: [
{
type: 'dev',
name: 'eslint-config-airbnb-base',
spec: '^14.2.1',
from: {
location: '/Users/isaacs/dev/npm/arborist/fixtures/eslint-plugin-react',
},
},
],
},
},
{
type: 'peer',
name: 'eslint',
spec: '^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0',
from: {
name: 'eslint-plugin-import',
version: '2.23.4',
location: 'node_modules/eslint-plugin-import',
isWorkspace: false,
dependents: [
{
type: 'dev',
name: 'eslint-plugin-import',
spec: '^2.23.4',
from: {
location: '/Users/isaacs/dev/npm/arborist/fixtures/eslint-plugin-react',
},
},
{
type: 'peer',
name: 'eslint-plugin-import',
spec: '^2.22.1',
from: {
name: 'eslint-config-airbnb-base',
version: '14.2.1',
location: 'node_modules/eslint-config-airbnb-base',
isWorkspace: false,
dependents: [
{
type: 'dev',
name: 'eslint-config-airbnb-base',
spec: '^14.2.1',
from: {
location: '/Users/isaacs/dev/npm/arborist/fixtures/eslint-plugin-react',
},
},
],
},
},
],
},
},
],
},
peer: {
name: 'eslint',
version: '7.31.0',
whileInstalling: {
name: 'eslint-plugin-react',
version: '7.24.0',
path: '/Users/isaacs/dev/npm/arborist/fixtures/eslint-plugin-react',
},
location: 'node_modules/eslint',
isWorkspace: false,
dependents: [
{
type: 'peer',
name: 'eslint',
spec: '^7.0.0',
from: {
name: 'eslint-plugin-eslint-plugin',
version: '3.5.1',
whileInstalling: {
name: 'eslint-plugin-react',
version: '7.24.0',
path: '/Users/isaacs/dev/npm/arborist/fixtures/eslint-plugin-react',
},
location: 'node_modules/eslint-plugin-eslint-plugin',
isWorkspace: false,
dependents: [
{
type: 'dev',
name: 'eslint-plugin-eslint-plugin',
spec: '^3.1.0',
error: 'MISSING',
from: {
location: '/Users/isaacs/dev/npm/arborist/fixtures/eslint-plugin-react',
},
},
],
},
},
],
},
},
strictPeerDeps: false,
force: false,
isMine: true,
},
}

BIN
deps/npm/test/fixtures/git-test.tgz vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,267 @@
module.exports = [
{
name: 'libnpm',
scope: 'unscoped',
version: '3.0.1',
description: 'Collection of programmatic APIs for the npm CLI',
keywords: ['npm', 'api', 'package manager', 'lib'],
date: '2019-07-16T17:50:00.572Z',
links: {
npm: 'https://www.npmjs.com/package/libnpm',
homepage: 'https://github.com/npm/libnpm#readme',
repository: 'https://github.com/npm/libnpm',
bugs: 'https://github.com/npm/libnpm/issues',
},
author: { name: 'Kat Marchán', email: 'kzm@zkat.tech' },
publisher: { username: 'isaacs', email: 'i@izs.me' },
maintainers: [
{ username: 'nlf', email: 'quitlahok@gmail.com' },
{ username: 'ruyadorno', email: 'ruyadorno@hotmail.com' },
{ username: 'darcyclarke', email: 'darcy@darcyclarke.me' },
{ username: 'isaacs', email: 'i@izs.me' },
],
},
{
name: 'libnpmaccess',
scope: 'unscoped',
version: '4.0.1',
description: 'programmatic library for `npm access` commands',
keywords: 'libnpmaccess',
date: '2020-11-03T19:19:00.526Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmaccess',
homepage: 'https://npmjs.com/package/libnpmaccess',
repository: 'https://github.com/npm/libnpmaccess',
bugs: 'https://github.com/npm/libnpmaccess/issues',
},
author: { name: 'Kat Marchán', email: 'kzm@sykosomatic.org' },
publisher: { username: 'nlf', email: 'quitlahok@gmail.com' },
maintainers: [
{ username: 'nlf', email: 'quitlahok@gmail.com' },
{ username: 'ruyadorno', email: 'ruyadorno@hotmail.com' },
{ username: 'darcyclarke', email: 'darcy@darcyclarke.me' },
{ username: 'isaacs', email: 'i@izs.me' },
],
},
{
name: '@evocateur/libnpmaccess',
scope: 'evocateur',
version: '3.1.2',
description: 'programmatic library for `npm access` commands',
date: '2019-07-16T19:43:33.959Z',
links: {
npm: 'https://www.npmjs.com/package/%40evocateur%2Flibnpmaccess',
homepage: 'https://npmjs.com/package/@evocateur/libnpmaccess',
repository: 'https://github.com/evocateur/libnpmaccess',
bugs: 'https://github.com/evocateur/libnpmaccess/issues',
},
author: { name: 'Kat Marchán', email: 'kzm@zkat.tech' },
publisher: { username: 'evocateur', email: 'daniel.stockman@gmail.com' },
maintainers: [{ username: 'evocateur', email: 'daniel.stockman@gmail.com' }],
},
{
name: '@evocateur/libnpmpublish',
scope: 'evocateur',
version: '1.2.2',
description: 'Programmatic API for the bits behind npm publish and unpublish',
date: '2019-07-16T19:40:40.850Z',
links: {
npm: 'https://www.npmjs.com/package/%40evocateur%2Flibnpmpublish',
homepage: 'https://npmjs.com/package/@evocateur/libnpmpublish',
repository: 'https://github.com/evocateur/libnpmpublish',
bugs: 'https://github.com/evocateur/libnpmpublish/issues',
},
author: { name: 'Kat Marchán', email: 'kzm@zkat.tech' },
publisher: { username: 'evocateur', email: 'daniel.stockman@gmail.com' },
maintainers: [{ username: 'evocateur', email: 'daniel.stockman@gmail.com' }],
},
{
name: 'libnpmorg',
scope: 'unscoped',
version: '2.0.1',
description: 'Programmatic api for `npm org` commands',
keywords: ['libnpm', 'npm', 'package manager', 'api', 'orgs', 'teams'],
date: '2020-11-03T19:21:57.757Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmorg',
homepage: 'https://npmjs.com/package/libnpmorg',
repository: 'https://github.com/npm/libnpmorg',
bugs: 'https://github.com/npm/libnpmorg/issues',
},
author: { name: 'Kat Marchán', email: 'kzm@sykosomatic.org' },
publisher: { username: 'nlf', email: 'quitlahok@gmail.com' },
maintainers: [
{ username: 'nlf', email: 'quitlahok@gmail.com' },
{ username: 'ruyadorno', email: 'ruyadorno@hotmail.com' },
{ username: 'darcyclarke', email: 'darcy@darcyclarke.me' },
{ username: 'isaacs', email: 'i@izs.me' },
],
},
{
name: 'libnpmsearch',
scope: 'unscoped',
version: '3.1.0',
description: 'Programmatic API for searching in npm and compatible registries.',
keywords: ['npm', 'search', 'api', 'libnpm'],
date: '2020-12-08T23:54:18.374Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmsearch',
homepage: 'https://npmjs.com/package/libnpmsearch',
repository: 'https://github.com/npm/libnpmsearch',
bugs: 'https://github.com/npm/libnpmsearch/issues',
},
author: { name: 'Kat Marchán', email: 'kzm@sykosomatic.org' },
publisher: { username: 'isaacs', email: 'i@izs.me' },
maintainers: [
{ username: 'nlf', email: 'quitlahok@gmail.com' },
{ username: 'ruyadorno', email: 'ruyadorno@hotmail.com' },
{ username: 'darcyclarke', email: 'darcy@darcyclarke.me' },
{ username: 'isaacs', email: 'i@izs.me' },
],
},
{
name: 'libnpmteam',
scope: 'unscoped',
version: '2.0.2',
description: 'npm Team management APIs',
date: '2020-11-03T19:24:42.380Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmteam',
homepage: 'https://npmjs.com/package/libnpmteam',
repository: 'https://github.com/npm/libnpmteam',
bugs: 'https://github.com/npm/libnpmteam/issues',
},
author: { name: 'Kat Marchán', email: 'kzm@zkat.tech' },
publisher: { username: 'nlf', email: 'quitlahok@gmail.com' },
maintainers: [
{ username: 'nlf', email: 'quitlahok@gmail.com' },
{ username: 'ruyadorno', email: 'ruyadorno@hotmail.com' },
{ username: 'darcyclarke', email: 'darcy@darcyclarke.me' },
{ username: 'isaacs', email: 'i@izs.me' },
],
},
{
name: 'libnpmpublish',
scope: 'unscoped',
version: '4.0.0',
description: 'Programmatic API for the bits behind npm publish and unpublish',
date: '2020-11-03T19:13:43.780Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmpublish',
homepage: 'https://npmjs.com/package/libnpmpublish',
repository: 'https://github.com/npm/libnpmpublish',
bugs: 'https://github.com/npm/libnpmpublish/issues',
},
author: { name: 'npm Inc.', email: 'support@npmjs.com' },
publisher: { username: 'nlf', email: 'quitlahok@gmail.com' },
maintainers: [
{ username: 'nlf', email: 'quitlahok@gmail.com' },
{ username: 'ruyadorno', email: 'ruyadorno@hotmail.com' },
{ username: 'darcyclarke', email: 'darcy@darcyclarke.me' },
{ username: 'isaacs', email: 'i@izs.me' },
],
},
{
name: 'libnpmfund',
scope: 'unscoped',
version: '1.0.2',
description: 'Programmatic API for npm fund',
keywords: [
'npm', 'npmcli',
'libnpm', 'cli',
'git', 'fund',
'gitfund',
],
date: '2020-12-08T23:22:00.213Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmfund',
homepage: 'https://github.com/npm/libnpmfund#readme',
repository: 'https://github.com/npm/libnpmfund',
bugs: 'https://github.com/npm/libnpmfund/issues',
},
author: { name: 'npm Inc.', email: 'support@npmjs.com' },
publisher: { username: 'isaacs', email: 'i@izs.me' },
maintainers: [
{ username: 'nlf', email: 'quitlahok@gmail.com' },
{ username: 'ruyadorno', email: 'ruyadorno@hotmail.com' },
{ username: 'darcyclarke', email: 'darcy@darcyclarke.me' },
{ username: 'isaacs', email: 'i@izs.me' },
],
},
{
name: '@npmcli/map-workspaces',
scope: 'npmcli',
version: '1.0.1',
description: 'Retrieves a name:pathname Map for a given workspaces config',
keywords: [
'\x1B[33mnpm\x1B[39m',
// eslint-disable-next-line no-octal-escape
'\x1b]4;0;?\007',
'\u001b[Hbad map',
'npmcli',
'libnpm',
'cli',
'workspaces',
'map-workspaces',
],
date: '2020-09-30T15:16:29.017Z',
links: {
npm: 'https://www.npmjs.com/package/%40npmcli%2Fmap-workspaces',
homepage: 'https://github.com/npm/map-workspaces#readme',
repository: 'https://github.com/npm/map-workspaces',
bugs: 'https://github.com/npm/map-workspaces/issues',
},
author: { name: 'npm Inc.', email: 'support@npmjs.com' },
publisher: { username: 'ruyadorno', email: 'ruyadorno@hotmail.com' },
maintainers: [
{ username: 'nlf', email: 'quitlahok@gmail.com' },
{ username: 'ruyadorno', email: 'ruyadorno@hotmail.com' },
{ username: 'darcyclarke', email: 'darcy@darcyclarke.me' },
{ username: 'isaacs', email: 'i@izs.me' },
],
},
{
name: '\x1B[31mlibnpmversion\x1B[39m',
scope: 'unscoped',
version: '1.0.7',
description: "library to do the things that '\x1B[32mnpm version\x1B[39m' does",
date: '2020-11-04T00:21:41.069Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmversion',
homepage: 'https://github.com/npm/libnpmversion#readme',
repository: 'https://github.com/npm/libnpmversion',
bugs: 'https://github.com/npm/libnpmversion/issues',
},
author: {
name: 'Isaac Z. Schlueter',
email: 'i@izs.me',
url: 'https://izs.me',
username: 'isaacs',
},
publisher: { username: 'isaacs', email: 'i@izs.me' },
maintainers: [
{ username: '\x1B[34mnlf\x1B[39m', email: 'quitlahok@gmail.com' },
{ username: 'ruyadorno', email: 'ruyadorno@hotmail.com' },
{ username: 'darcyclarke', email: 'darcy@darcyclarke.me' },
{ username: 'isaacs', email: 'i@izs.me' },
],
},
{
name: '@types/libnpmsearch',
scope: 'types',
version: '2.0.1',
description: 'TypeScript definitions for libnpmsearch',
date: '2019-09-26T22:24:28.713Z',
links: { npm: 'https://www.npmjs.com/package/%40types%2Flibnpmsearch' },
publisher: { username: 'types', email: 'ts-npm-types@microsoft.com' },
maintainers: [{ username: 'types', email: 'ts-npm-types@microsoft.com' }],
},
{
name: 'pkg-no-desc',
scope: 'unscoped',
version: '1.0.0',
date: '2019-09-26T22:24:28.713Z',
publisher: { username: 'lukekarrys', email: 'lukekarrys' },
maintainers: [{ username: 'lukekarrys', email: 'lukekarrys' }],
},
]

View File

@ -0,0 +1,36 @@
{
"array": [
<<<<<<< HEAD
100,
{
"foo": "baz"
},
||||||| merged common ancestors
1,
=======
111,
1,
2,
3,
{
"foo": "bar"
},
>>>>>>> a
1
],
"a": {
"b": {
<<<<<<< HEAD
"c": {
"x": "bbbb"
}
||||||| merged common ancestors
"c": {
"x": "aaaa"
}
=======
"c": "xxxx"
>>>>>>> a
}
}
}

108
deps/npm/test/fixtures/mock-logs.js vendored Normal file
View File

@ -0,0 +1,108 @@
const { log: { LEVELS } } = require('proc-log')
const { stripVTControlCharacters: stripAnsi } = require('node:util')
const logPrefix = new RegExp(`^npm (${LEVELS.join('|')})\\s`)
const isLog = (str) => logPrefix.test(stripAnsi(str))
// We only strip trailing newlines since some output will
// have significant tabs and spaces
const trimTrailingNewline = (str) => str.replace(/\n$/, '')
const joinAndTrimTrailingNewlines = (arr) =>
trimTrailingNewline(arr.map(trimTrailingNewline).join('\n'))
const logsByTitle = (logs) => ({
byTitle: {
value: (title) => {
return logs
.filter((l) => stripAnsi(l.message).startsWith(`${title} `))
.map((l) => l.message)
},
},
})
module.exports = () => {
const outputs = []
const outputErrors = []
const fullOutput = []
const levelLogs = []
const logs = Object.defineProperties([], {
...logsByTitle(levelLogs),
...LEVELS.reduce((acc, level) => {
acc[level] = {
get () {
const byLevel = levelLogs.filter((l) => l.level === level)
return Object.defineProperties(byLevel.map((l) => l.message), logsByTitle(byLevel))
},
}
return acc
}, {}),
})
const streams = {
stderr: {
cursorTo: () => {},
clearLine: () => {},
write: (str) => {
str = trimTrailingNewline(str)
// Use the beginning of each line to determine if its a log
// or an output error since we write both of those to stderr.
// This couples logging format to this test but we only need
// to do it in a single place so hopefully its easy to change
// in the future if/when we refactor what logs look like.
if (!isLog(str)) {
outputErrors.push(str)
fullOutput.push(str)
return
}
// Split on spaces for the heading and level/label. We know that
// none of those have spaces but could be colorized so there's no
// other good way to get each of those including control chars
const [rawHeading, rawLevel] = str.split(' ')
const rawPrefix = `${rawHeading} ${rawLevel} `
// If message is colorized we can just replaceAll with the string since
// it will be unique due to control chars. Otherwise we create a regex
// that will only match the beginning of each line.
const prefix = stripAnsi(str) !== str ? rawPrefix : new RegExp(`^${rawPrefix}`, 'gm')
// The level needs color stripped always because we use it to filter logs
const level = stripAnsi(rawLevel)
logs.push(str.replaceAll(prefix, `${level} `))
fullOutput.push(str.replaceAll(prefix, `${level} `))
levelLogs.push({ level, message: str.replaceAll(prefix, '') })
},
},
stdout: {
write: (str) => {
outputs.push(trimTrailingNewline(str))
fullOutput.push(trimTrailingNewline(str))
},
},
}
return {
streams,
logs: {
outputs,
joinedOutput: () => joinAndTrimTrailingNewlines(outputs),
clearOutput: () => {
outputs.length = 0
outputErrors.length = 0
fullOutput.length = 0
},
outputErrors,
joinedOutputError: () => joinAndTrimTrailingNewlines(outputs),
fullOutput,
joinedFullOutput: () => joinAndTrimTrailingNewlines(fullOutput),
logs,
clearLogs: () => {
levelLogs.length = 0
logs.length = 0
},
},
}
}

470
deps/npm/test/fixtures/mock-npm.js vendored Normal file
View File

@ -0,0 +1,470 @@
const os = require('node:os')
const fs = require('node:fs').promises
const fsSync = require('node:fs')
const path = require('node:path')
const tap = require('tap')
const mockLogs = require('./mock-logs.js')
const mockGlobals = require('@npmcli/mock-globals')
const tmock = require('./tmock')
const MockRegistry = require('@npmcli/mock-registry')
const defExitCode = process.exitCode
const changeDir = (dir) => {
if (dir) {
const cwd = process.cwd()
process.chdir(dir)
return () => process.chdir(cwd)
}
return () => {}
}
const setGlobalNodeModules = (globalDir) => {
const updateSymlinks = (obj, visit) => {
for (const [key, value] of Object.entries(obj)) {
if (/Fixture<symlink>/.test(value.toString())) {
obj[key] = tap.fixture('symlink', path.join('..', value.content))
} else if (typeof value === 'object') {
obj[key] = updateSymlinks(value, visit)
}
}
return obj
}
if (globalDir.lib) {
throw new Error('`globalPrefixDir` should not have a top-level `lib/` directory, only a ' +
'top-level `node_modules/` dir that gets set in the correct location based on platform. ' +
`Received the following top level entries: ${Object.keys(globalDir).join(', ')}.`
)
}
if (process.platform !== 'win32' && globalDir.node_modules) {
const { node_modules: nm, ...rest } = globalDir
return {
...rest,
lib: { node_modules: updateSymlinks(nm) },
}
}
return globalDir
}
const buildMocks = (t, mocks) => {
const allMocks = { ...mocks }
// The definitions must be mocked since they are a singleton that reads from
// process and environs to build defaults in order to break the requiure
// cache. We also need to mock them with any mocks that were passed in for the
// test in case those mocks are for things like ci-info which is used there.
const definitions = '@npmcli/config/lib/definitions'
allMocks[definitions] = tmock(t, definitions, allMocks)
return allMocks
}
const getMockNpm = async (t, { mocks, init, load, npm: npmOpts }) => {
const { streams, logs } = mockLogs()
const allMocks = buildMocks(t, mocks)
const Npm = tmock(t, '{LIB}/npm.js', allMocks)
class MockNpm extends Npm {
constructor (opts) {
super({
...opts,
...streams,
...npmOpts,
})
}
async load () {
const res = await super.load()
// Wait for any promises (currently only log file cleaning) to be
// done before returning from load in tests. This helps create more
// deterministic testing behavior because in reality that promise
// is left hanging on purpose as a best-effort and the process gets
// closed regardless of if it has finished or not.
await Promise.all(this.unrefPromises)
return res
}
}
const npm = init ? new MockNpm() : null
if (npm && load) {
await npm.load()
}
return {
Npm: MockNpm,
npm,
...logs,
}
}
const mockNpms = new Map()
const setupMockNpm = async (t, {
init = true,
load = init,
// preload a command
command = null, // string name of the command
exec = null, // optionally exec the command before returning
// test dirs
prefixDir = {},
homeDir = {},
cacheDir = {},
globalPrefixDir = { node_modules: {} },
otherDirs = {},
chdir = ({ prefix }) => prefix,
// setup config, env vars, mocks, npm opts
config: _config = {},
mocks = {},
globals = {},
npm: npmOpts = {},
argv: rawArgv = [],
} = {}) => {
// easy to accidentally forget to pass in tap
if (!(t instanceof tap.Test)) {
throw new Error('first argument must be a tap instance')
}
// mockNpm is designed to only be run once per test chain so we assign it to
// the test in the cache and error if it is attempted to run again
let tapInstance = t
while (tapInstance) {
if (mockNpms.has(tapInstance)) {
throw new Error('mockNpm can only be called once in each t.test chain')
}
tapInstance = tapInstance.parent
}
mockNpms.set(t, true)
if (!init && load) {
throw new Error('cant `load` without `init`')
}
// These are globals manipulated by npm itself that we need to reset to their
// original values between tests
const npmEnvs = Object.keys(process.env).filter(k => k.startsWith('npm_'))
mockGlobals(t, {
process: {
title: process.title,
execPath: process.execPath,
env: {
NODE_ENV: process.env.NODE_ENV,
COLOR: process.env.COLOR,
// further, these are npm controlled envs that we need to zero out before
// before the test. setting them to undefined ensures they are not set and
// also returned to their original value after the test
...npmEnvs.reduce((acc, k) => {
acc[k] = undefined
return acc
}, {}),
},
},
})
const dir = t.testdir({
home: homeDir,
prefix: prefixDir,
cache: cacheDir,
global: setGlobalNodeModules(globalPrefixDir),
other: otherDirs,
})
const dirs = {
testdir: dir,
prefix: path.join(dir, 'prefix'),
cache: path.join(dir, 'cache'),
globalPrefix: path.join(dir, 'global'),
home: path.join(dir, 'home'),
other: path.join(dir, 'other'),
}
// Option objects can also be functions that are called with all the dir paths
// so they can be used to set configs that need to be based on paths
const withDirs = (v) => typeof v === 'function' ? v(dirs) : v
const teardownDir = changeDir(withDirs(chdir))
const defaultConfigs = {
// We want to fail fast when writing tests. Default this to 0 unless it was
// explicitly set in a test.
'fetch-retries': 0,
cache: dirs.cache,
// This will give us all the loglevels including timing in a non-colorized way
// so we can easily assert their contents. Individual tests can overwrite these
// with my passing in configs if they need to test other forms of output.
loglevel: 'silly',
color: false,
}
const { argv, env, config } = Object.entries({ ...defaultConfigs, ...withDirs(_config) })
.reduce((acc, [key, value]) => {
// nerfdart configs passed in need to be set via env var instead of argv
// and quoted with `"` so mock globals will ignore that it contains dots
if (key.startsWith('//')) {
acc.env[`process.env."npm_config_${key}"`] = value
} else if (value !== undefined) {
const values = [].concat(value)
acc.argv.push(...values.flatMap(v => v === '' ? `--${key}` : `--${key}=${v.toString()}`))
}
if (value !== undefined) {
acc.config[key] = value
}
return acc
}, { argv: [...rawArgv], env: {}, config: {} })
const mockedGlobals = mockGlobals(t, {
'process.env.HOME': dirs.home,
// global prefix cannot be (easily) set via argv so this is the easiest way
// to set it that also closely mimics the behavior a user would see since it
// will already be set while `npm.load()` is being run
// Note that this only sets the global prefix and the prefix is set via chdir
'process.env.PREFIX': dirs.globalPrefix,
...withDirs(globals),
...env,
})
const { npm, ...mockNpm } = await getMockNpm(t, {
init,
load,
mocks: withDirs(mocks),
npm: {
argv: command ? [command, ...argv] : argv,
excludeNpmCwd: true,
...withDirs(npmOpts),
},
})
if (config.omit?.includes('prod')) {
// XXX(HACK): --omit=prod is not a valid config according to the definitions but
// it was being hacked in via flatOptions for older tests so this is to
// preserve that behavior and reduce churn in the snapshots. this should be
// removed or fixed in the future
npm.flatOptions.omit.push('prod')
}
t.teardown(() => {
if (npm) {
npm.unload()
}
// only set exitCode back if we're passing tests
if (t.passing()) {
process.exitCode = defExitCode
}
teardownDir()
})
const mockCommand = {}
if (command) {
const Cmd = mockNpm.Npm.cmd(command)
mockCommand.cmd = new Cmd(npm)
mockCommand[command] = {
usage: Cmd.describeUsage,
exec: (args) => npm.exec(command, args),
completion: (args) => Cmd.completion(args, npm),
}
if (exec) {
await mockCommand[command].exec(exec === true ? [] : exec)
// assign string output to the command now that we have it
// for easier testing
mockCommand[command].output = mockNpm.joinedOutput()
}
}
return {
npm,
mockedGlobals,
...mockNpm,
...dirs,
...mockCommand,
debugFile: async () => {
const readFiles = npm.logFiles.map(f => fs.readFile(f))
const logFiles = await Promise.all(readFiles)
return logFiles
.flatMap((d) => d.toString().trim().split(os.EOL))
.filter(Boolean)
.join('\n')
},
timingFile: async () => {
const data = await fs.readFile(npm.logPath + 'timing.json', 'utf8')
return JSON.parse(data)
},
}
}
const loadNpmWithRegistry = async (t, opts) => {
const mock = await setupMockNpm(t, opts)
return {
...mock,
...loadRegistry(t, mock, opts),
...loadFsAssertions(t, mock),
}
}
const loadRegistry = (t, mock, opts) => {
const registry = new MockRegistry({
tap: t,
registry: opts.registry ?? mock.npm.config.get('registry'),
authorization: opts.authorization,
basic: opts.basic,
debug: opts.debugRegistry ?? false,
strict: opts.strictRegistryNock ?? true,
})
return { registry }
}
const loadFsAssertions = (t, mock) => {
const fileShouldExist = (filePath) => {
t.equal(
fsSync.existsSync(path.join(mock.npm.prefix, filePath)), true, `${filePath} should exist`
)
}
const fileShouldNotExist = (filePath) => {
t.equal(
fsSync.existsSync(path.join(mock.npm.prefix, filePath)), false, `${filePath} should not exist`
)
}
const packageVersionMatches = (filePath, version) => {
t.equal(
JSON.parse(fsSync.readFileSync(path.join(mock.npm.prefix, filePath), 'utf8')).version, version
)
}
const packageInstalled = (target) => {
const spec = path.basename(target)
const dirname = path.dirname(target)
const [name, version = '1.0.0'] = spec.split('@')
fileShouldNotExist(`${dirname}/${name}/${name}@${version}.txt`)
packageVersionMatches(`${dirname}/${name}/package.json`, version)
fileShouldExist(`${dirname}/${name}/index.js`)
}
const packageMissing = (target) => {
const spec = path.basename(target)
const dirname = path.dirname(target)
const [name, version = '1.0.0'] = spec.split('@')
fileShouldNotExist(`${dirname}/${name}/${name}@${version}.txt`)
fileShouldNotExist(`${dirname}/${name}/package.json`)
fileShouldNotExist(`${dirname}/${name}/index.js`)
}
const packageDirty = (target) => {
const spec = path.basename(target)
const dirname = path.dirname(target)
const [name, version = '1.0.0'] = spec.split('@')
fileShouldExist(`${dirname}/${name}/${name}@${version}.txt`)
packageVersionMatches(`${dirname}/${name}/package.json`, version)
fileShouldNotExist(`${dirname}/${name}/index.js`)
}
const assert = {
fileShouldExist,
fileShouldNotExist,
packageVersionMatches,
packageInstalled,
packageMissing,
packageDirty,
}
return { assert }
}
/** breaks down a spec "abbrev@1.1.1" into different parts for mocking */
function dependencyDetails (spec, opt = {}) {
const [name, version = '1.0.0'] = spec.split('@')
const { parent, hoist = true, ws, clean = true } = opt
const modulePathPrefix = !hoist && parent ? `${parent}/` : ''
const modulePath = `${modulePathPrefix}node_modules/${name}`
const resolved = `https://registry.npmjs.org/${name}/-/${name}-${version}.tgz`
// deps
const wsEntries = Object.entries({ ...ws })
const depsMap = wsEntries.map(([s, o]) => dependencyDetails(s, { ...o, parent: name }))
const dependencies = Object.assign({}, ...depsMap.map(d => d.packageDependency))
const spreadDependencies = depsMap.length ? { dependencies } : {}
// package and lock objects
const packageDependency = { [name]: version }
const packageLockEntry = { [modulePath]: { version, resolved } }
const packageLockLink = { [modulePath]: { resolved: name, link: true } }
const packageLockLocal = { [name]: { version, dependencies } }
// build package.js
const packageJSON = { name, version, ...spreadDependencies }
const packageJSONString = JSON.stringify(packageJSON)
const packageJSONFile = { 'package.json': packageJSONString }
// build index.js
const indexJSString = 'module.exports = "hello world"'
const indexJSFile = { 'index.js': indexJSString }
// tarball
const packageFiles = { ...packageJSONFile, ...indexJSFile }
const nodeModules = Object.assign({}, ...depsMap.map(d => d.hoist ? {} : d.dirtyOrCleanDir))
const nodeModulesDir = { node_modules: nodeModules }
const packageDir = { [name]: { ...packageFiles, ...nodeModulesDir } }
const tarballDir = { [`${name}@${version}`]: packageFiles }
// dirty files
const dirtyFile = { [`${name}@${version}.txt`]: 'dirty file' }
const dirtyFiles = { ...packageJSONFile, ...dirtyFile }
const dirtyDir = { [name]: dirtyFiles }
const dirtyOrCleanDir = clean ? {} : dirtyDir
return {
packageDependency,
hoist,
depsMap,
dirtyOrCleanDir,
tarballDir,
packageDir,
packageLockEntry,
packageLockLink,
packageLockLocal,
}
}
function workspaceMock (t, opts) {
const toObject = [(a, c) => ({ ...a, ...c }), {}]
const { workspaces: workspacesDef, ...rest } = { clean: true, ...opts }
const workspaces = Object.fromEntries(Object.entries(workspacesDef).map(([name, ws]) => {
return [name, Object.fromEntries(Object.entries(ws).map(([wsPackageDep, wsPackageDepOpts]) => {
return [wsPackageDep, { ...rest, ...wsPackageDepOpts }]
}))]
}))
const root = 'workspace-root'
const version = '1.0.0'
const names = Object.keys(workspaces)
const ws = Object.entries(workspaces).map(([name, _ws]) => dependencyDetails(name, { ws: _ws }))
const deps = ws.map(({ depsMap }) => depsMap).flat()
const tarballs = deps.map(w => w.tarballDir).reduce(...toObject)
const symlinks = names
.map((name) => ({ [name]: t.fixture('symlink', `../${name}`) })).reduce(...toObject)
const hoisted = deps.filter(d => d.hoist).map(w => w.dirtyOrCleanDir).reduce(...toObject)
const workspaceFolders = ws.map(w => w.packageDir).reduce(...toObject)
const packageJSON = { name: root, version, workspaces: names }
const packageLockJSON = ({
name: root,
version,
lockfileVersion: 3,
requires: true,
packages: {
'': { name: root, version, workspaces: names },
...deps.filter(d => d.hoist).map(d => d.packageLockEntry).reduce(...toObject),
...ws.map(d => d.packageLockEntry).flat().reduce(...toObject),
...ws.map(d => d.packageLockLink).flat().reduce(...toObject),
...ws.map(d => d.packageLockLocal).flat().reduce(...toObject),
...deps.filter(d => !d.hoist).map(d => d.packageLockEntry).reduce(...toObject),
},
})
return {
tarballs,
node_modules: {
...hoisted,
...symlinks,
},
'package-lock.json': JSON.stringify(packageLockJSON),
'package.json': JSON.stringify(packageJSON),
...workspaceFolders,
}
}
module.exports = setupMockNpm
module.exports.load = setupMockNpm
module.exports.setGlobalNodeModules = setGlobalNodeModules
module.exports.loadNpmWithRegistry = loadNpmWithRegistry
module.exports.workspaceMock = workspaceMock

View File

@ -0,0 +1,94 @@
{
"attestations": [
{
"predicateType": "https://slsa.dev/provenance/v0.2",
"bundle": {
"mediaType": "application/vnd.dev.sigstore.bundle+json;version=0.1",
"verificationMaterial": {
"x509CertificateChain": {
"certificates": [
{
"rawBytes": "MIIDmzCCAyGgAwIBAgIUce0wM1Ev1pqBXH9W1BbvEg9RopYwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjMwMjA5MTc1NjAwWhcNMjMwMjA5MTgwNjAwWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0SgHPgKy+HgMtXdqkkgY6Ji1v7wc+lxnnatY73cbKFwQzw+/x8288IwIz6y54dtznSXnjbzNMdNS0Q2rfMsMcaOCAkAwggI8MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUVVMaFO5X4Xzc/tiJCfm0WXa75QIwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wZAYDVR0RAQH/BFowWIZWaHR0cHM6Ly9naXRodWIuY29tL3NpZ3N0b3JlL3NpZ3N0b3JlLWpzLy5naXRodWIvd29ya2Zsb3dzL3B1Ymxpc2gueW1sQHJlZnMvdGFncy92MS4wLjAwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAVBgorBgEEAYO/MAECBAdyZWxlYXNlMDYGCisGAQQBg78wAQMEKDA2NTI4OTk3YzNjOGFiOWY4NjRmYWQ5YTM2NTg0NDZhY2E3ZmQ4NmQwFQYKKwYBBAGDvzABBAQHcHVibGlzaDAiBgorBgEEAYO/MAEFBBRzaWdzdG9yZS9zaWdzdG9yZS1qczAeBgorBgEEAYO/MAEGBBByZWZzL3RhZ3MvdjEuMC4wMIGJBgorBgEEAdZ5AgQCBHsEeQB3AHUA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGGN1HpGQAABAMARjBEAiB/E0+AFpKimPxI/TQDXeCa06+wtpwvLhyPrbHOQYu74gIgB/9fdZD+uHvUBHyptxaGoBxdJfUKEYx9nhaZw2LeZuwwCgYIKoZIzj0EAwMDaAAwZQIxAPW070C7IM0RrAU5rMpP25TFH/rfKvbvqRNnUoPfvIlA9q7Abe8BHIl97pTmf/5vJgIwbZ4myRXGWjB0LUyzplC2GX0kklVGYeqRM5xxsxAK0zwd/U7KjoFIlp/gkyLyiMHH"
},
{
"rawBytes": "MIICGjCCAaGgAwIBAgIUALnViVfnU0brJasmRkHrn/UnfaQwCgYIKoZIzj0EAwMwKjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MREwDwYDVQQDEwhzaWdzdG9yZTAeFw0yMjA0MTMyMDA2MTVaFw0zMTEwMDUxMzU2NThaMDcxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEeMBwGA1UEAxMVc2lnc3RvcmUtaW50ZXJtZWRpYXRlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE8RVS/ysH+NOvuDZyPIZtilgUF9NlarYpAd9HP1vBBH1U5CV77LSS7s0ZiH4nE7Hv7ptS6LvvR/STk798LVgMzLlJ4HeIfF3tHSaexLcYpSASr1kS0N/RgBJz/9jWCiXno3sweTAOBgNVHQ8BAf8EBAMCAQYwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU39Ppz1YkEZb5qNjpKFWixi4YZD8wHwYDVR0jBBgwFoAUWMAeX5FFpWapesyQoZMi0CrFxfowCgYIKoZIzj0EAwMDZwAwZAIwPCsQK4DYiZYDPIaDi5HFKnfxXx6ASSVmERfsynYBiX2X6SJRnZU84/9DZdnFvvxmAjBOt6QpBlc4J/0DxvkTCqpclvziL6BCCPnjdlIB3Pu3BxsPmygUY7Ii2zbdCdliiow="
},
{
"rawBytes": "MIIB9zCCAXygAwIBAgIUALZNAPFdxHPwjeDloDwyYChAO/4wCgYIKoZIzj0EAwMwKjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MREwDwYDVQQDEwhzaWdzdG9yZTAeFw0yMTEwMDcxMzU2NTlaFw0zMTEwMDUxMzU2NThaMCoxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjERMA8GA1UEAxMIc2lnc3RvcmUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAT7XeFT4rb3PQGwS4IajtLk3/OlnpgangaBclYpsYBr5i+4ynB07ceb3LP0OIOZdxexX69c5iVuyJRQ+Hz05yi+UF3uBWAlHpiS5sh0+H2GHE7SXrk1EC5m1Tr19L9gg92jYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRYwB5fkUWlZql6zJChkyLQKsXF+jAfBgNVHSMEGDAWgBRYwB5fkUWlZql6zJChkyLQKsXF+jAKBggqhkjOPQQDAwNpADBmAjEAj1nHeXZp+13NWBNa+EDsDP8G1WWg1tCMWP/WHPqpaVo0jhsweNFZgSs0eE7wYI4qAjEA2WB9ot98sIkoF3vZYdd3/VtWB5b9TNMea7Ix/stJ5TfcLLeABLE4BNJOsQ4vnBHJ"
}
]
},
"tlogEntries": [
{
"logIndex": "12988397",
"logId": {
"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="
},
"kindVersion": {
"kind": "intoto",
"version": "0.0.2"
},
"integratedTime": "1675965360",
"inclusionPromise": {
"signedEntryTimestamp": "MEUCID8bfktgHysxMJAIXz6CqqKHGAYPp/X6FZrS9SDtKdbcAiEAg+0zUFNPJKEVX6m33aCU+CRBgWkDNOC8oE4jHoco4kw="
},
"inclusionProof": null,
"canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjIiLCJraW5kIjoiaW50b3RvIiwic3BlYyI6eyJjb250ZW50Ijp7ImVudmVsb3BlIjp7InBheWxvYWRUeXBlIjoiYXBwbGljYXRpb24vdm5kLmluLXRvdG8ranNvbiIsInNpZ25hdHVyZXMiOlt7InB1YmxpY0tleSI6IkxTMHRMUzFDUlVkSlRpQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENrMUpTVVJ0ZWtORFFYbEhaMEYzU1VKQlowbFZZMlV3ZDAweFJYWXhjSEZDV0VnNVZ6RkNZblpGWnpsU2IzQlpkME5uV1VsTGIxcEplbW93UlVGM1RYY0tUbnBGVmsxQ1RVZEJNVlZGUTJoTlRXTXliRzVqTTFKMlkyMVZkVnBIVmpKTlVqUjNTRUZaUkZaUlVVUkZlRlo2WVZka2VtUkhPWGxhVXpGd1ltNVNiQXBqYlRGc1drZHNhR1JIVlhkSWFHTk9UV3BOZDAxcVFUVk5WR014VG1wQmQxZG9ZMDVOYWsxM1RXcEJOVTFVWjNkT2FrRjNWMnBCUVUxR2EzZEZkMWxJQ2t0dldrbDZhakJEUVZGWlNVdHZXa2w2YWpCRVFWRmpSRkZuUVVVd1UyZElVR2RMZVN0SVowMTBXR1J4YTJ0bldUWkthVEYyTjNkaksyeDRibTVoZEZrS056TmpZa3RHZDFGNmR5c3ZlRGd5T0RoSmQwbDZObmsxTkdSMGVtNVRXRzVxWW5wT1RXUk9VekJSTW5KbVRYTk5ZMkZQUTBGclFYZG5aMGs0VFVFMFJ3cEJNVlZrUkhkRlFpOTNVVVZCZDBsSVowUkJWRUpuVGxaSVUxVkZSRVJCUzBKblozSkNaMFZHUWxGalJFRjZRV1JDWjA1V1NGRTBSVVpuVVZWV1ZrMWhDa1pQTlZnMFdIcGpMM1JwU2tObWJUQlhXR0UzTlZGSmQwaDNXVVJXVWpCcVFrSm5kMFp2UVZVek9WQndlakZaYTBWYVlqVnhUbXB3UzBaWGFYaHBORmtLV2tRNGQxcEJXVVJXVWpCU1FWRklMMEpHYjNkWFNWcFhZVWhTTUdOSVRUWk1lVGx1WVZoU2IyUlhTWFZaTWpsMFRETk9jRm96VGpCaU0wcHNURE5PY0FwYU0wNHdZak5LYkV4WGNIcE1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU0wSXhXVzE0Y0dNeVozVmxWekZ6VVVoS2JGcHVUWFprUjBadUNtTjVPVEpOVXpSM1RHcEJkMDlSV1V0TGQxbENRa0ZIUkhaNlFVSkJVVkZ5WVVoU01HTklUVFpNZVRrd1lqSjBiR0pwTldoWk0xSndZakkxZWt4dFpIQUtaRWRvTVZsdVZucGFXRXBxWWpJMU1GcFhOVEJNYlU1MllsUkJWa0puYjNKQ1owVkZRVmxQTDAxQlJVTkNRV1I1V2xkNGJGbFlUbXhOUkZsSFEybHpSd3BCVVZGQ1p6YzRkMEZSVFVWTFJFRXlUbFJKTkU5VWF6TlplazVxVDBkR2FVOVhXVFJPYWxKdFdWZFJOVmxVVFRKT1ZHY3dUa1JhYUZreVJUTmFiVkUwQ2s1dFVYZEdVVmxMUzNkWlFrSkJSMFIyZWtGQ1FrRlJTR05JVm1saVIyeDZZVVJCYVVKbmIzSkNaMFZGUVZsUEwwMUJSVVpDUWxKNllWZGtlbVJIT1hrS1dsTTVlbUZYWkhwa1J6bDVXbE14Y1dONlFXVkNaMjl5UW1kRlJVRlpUeTlOUVVWSFFrSkNlVnBYV25wTU0xSm9Xak5OZG1ScVJYVk5RelIzVFVsSFNncENaMjl5UW1kRlJVRmtXalZCWjFGRFFraHpSV1ZSUWpOQlNGVkJNMVF3ZDJGellraEZWRXBxUjFJMFkyMVhZek5CY1VwTFdISnFaVkJMTXk5b05IQjVDbWRET0hBM2J6UkJRVUZIUjA0eFNIQkhVVUZCUWtGTlFWSnFRa1ZCYVVJdlJUQXJRVVp3UzJsdFVIaEpMMVJSUkZobFEyRXdOaXQzZEhCM2RreG9lVkFLY21KSVQxRlpkVGMwWjBsblFpODVabVJhUkN0MVNIWlZRa2g1Y0hSNFlVZHZRbmhrU21aVlMwVlplRGx1YUdGYWR6Sk1aVnAxZDNkRFoxbEpTMjlhU1FwNmFqQkZRWGROUkdGQlFYZGFVVWw0UVZCWE1EY3dRemRKVFRCU2NrRlZOWEpOY0ZBeU5WUkdTQzl5Wmt0MlluWnhVazV1Vlc5UVpuWkpiRUU1Y1RkQkNtSmxPRUpJU1d3NU4zQlViV1l2TlhaS1owbDNZbG8wYlhsU1dFZFhha0l3VEZWNWVuQnNRekpIV0RCcmEyeFdSMWxsY1ZKTk5YaDRjM2hCU3pCNmQyUUtMMVUzUzJwdlJrbHNjQzluYTNsTWVXbE5TRWdLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89Iiwic2lnIjoiVFVWWlEwbFJSREV3YTBGdU0yeERMekZ5U25aWVFuUlRSR05yWW5GclMwVnRlak0yT1dkUVJFdGlOR3hITkhwTlMxRkphRUZRTVN0U2FHSk5ZMEZUYzJaWWFIaHdXRXRPUTBGcVNtSXJNMEYyTTBKeU9UVmxTMFEzVmt3dlFrVkMifV19LCJoYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiNjI2OWQzNzQ2MzI0MjM5YzEzOGJkZTMzMDEzMTVlY2FkNmI4ZGM5YzcwY2RlYTBhODEyYjYzYTUzOGJmYzdlYyJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6Ijg0NWU5MTRlYmJhZTBkNmZmY2FlMmFmYjc3YzdkZWY0NzkzMDVjOWVlMzExMDE0MDJmZTQ3NWU2ZDIzZjExYzkifX19fQ=="
}
],
"timestampVerificationData": null
},
"dsseEnvelope": {
"payload": "eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInN1YmplY3QiOlt7Im5hbWUiOiJwa2c6bnBtL3NpZ3N0b3JlQDEuMC4wIiwiZGlnZXN0Ijp7InNoYTUxMiI6IjdiZWE5ZjZlN2ZmMzdmNWZhYjBiMzZiZjA2MTIwMGZmZjAzMDk5ZmQyZmQ2OTZiOTFkMDRiYzVlNGYyMjVlYjlmZDZlMGNhZGNhZDU0YmE5ODBmNDNmYjM1MmE5OWU4ODEwYjRlMGFiZWI1YzBlZjJjZjkxMDhjZDFmMjU4YjM2In19XSwicHJlZGljYXRlVHlwZSI6Imh0dHBzOi8vc2xzYS5kZXYvcHJvdmVuYW5jZS92MC4yIiwicHJlZGljYXRlIjp7ImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vY2xpL2doYUB2MCIsImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vbnBtL2NsaUA5LjQuMiJ9LCJpbnZvY2F0aW9uIjp7ImNvbmZpZ1NvdXJjZSI6eyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL3NpZ3N0b3JlL3NpZ3N0b3JlLWpzQHJlZnMvdGFncy92MS4wLjAiLCJkaWdlc3QiOnsic2hhMSI6IjA2NTI4OTk3YzNjOGFiOWY4NjRmYWQ5YTM2NTg0NDZhY2E3ZmQ4NmQifSwiZW50cnlQb2ludCI6InNpZ3N0b3JlL3NpZ3N0b3JlLWpzLy5naXRodWIvd29ya2Zsb3dzL3B1Ymxpc2gueW1sQHJlZnMvdGFncy92MS4wLjAifSwicGFyYW1ldGVycyI6e30sImVudmlyb25tZW50Ijp7IkdJVEhVQl9BQ1RPUl9JRCI6IjM5ODAyNyIsIkdJVEhVQl9FVkVOVF9OQU1FIjoicmVsZWFzZSIsIkdJVEhVQl9SRUYiOiJyZWZzL3RhZ3MvdjEuMC4wIiwiR0lUSFVCX1JFRl9UWVBFIjoidGFnIiwiR0lUSFVCX1JFUE9TSVRPUlkiOiJzaWdzdG9yZS9zaWdzdG9yZS1qcyIsIkdJVEhVQl9SRVBPU0lUT1JZX0lEIjoiNDk1NTc0NTU1IiwiR0lUSFVCX1JFUE9TSVRPUllfT1dORVJfSUQiOiI3MTA5NjM1MyIsIkdJVEhVQl9SVU5fQVRURU1QVCI6IjEiLCJHSVRIVUJfUlVOX0lEIjoiNDEzNzAyODgxNiIsIkdJVEhVQl9SVU5fTlVNQkVSIjoiOSIsIkdJVEhVQl9TSEEiOiIwNjUyODk5N2MzYzhhYjlmODY0ZmFkOWEzNjU4NDQ2YWNhN2ZkODZkIiwiR0lUSFVCX1dPUktGTE9XX1JFRiI6InNpZ3N0b3JlL3NpZ3N0b3JlLWpzLy5naXRodWIvd29ya2Zsb3dzL3B1Ymxpc2gueW1sQHJlZnMvdGFncy92MS4wLjAiLCJHSVRIVUJfV09SS0ZMT1dfU0hBIjoiMDY1Mjg5OTdjM2M4YWI5Zjg2NGZhZDlhMzY1ODQ0NmFjYTdmZDg2ZCJ9fSwibWV0YWRhdGEiOnsiYnVpbGRJbnZvY2F0aW9uSWQiOiI0MTM3MDI4ODE2LTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6ZmFsc2UsImVudmlyb25tZW50IjpmYWxzZSwibWF0ZXJpYWxzIjpmYWxzZX0sInJlcHJvZHVjaWJsZSI6ZmFsc2V9LCJtYXRlcmlhbHMiOlt7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vc2lnc3RvcmUvc2lnc3RvcmUtanMiLCJkaWdlc3QiOnsic2hhMSI6IjA2NTI4OTk3YzNjOGFiOWY4NjRmYWQ5YTM2NTg0NDZhY2E3ZmQ4NmQifX1dfX0=",
"payloadType": "application/vnd.in-toto+json",
"signatures": [
{
"sig": "MEYCIQD10kAn3lC/1rJvXBtSDckbqkKEmz369gPDKb4lG4zMKQIhAP1+RhbMcASsfXhxpXKNCAjJb+3Av3Br95eKD7VL/BEB",
"keyid": ""
}
]
}
}
},
{
"predicateType": "https://github.com/npm/attestation/tree/main/specs/publish/v0.1",
"bundle": {
"mediaType": "application/vnd.dev.sigstore.bundle+json;version=0.1",
"verificationMaterial": {
"publicKey": {
"hint": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"
},
"tlogEntries": [
{
"logIndex": "12988399",
"logId": {
"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="
},
"kindVersion": {
"kind": "intoto",
"version": "0.0.2"
},
"integratedTime": "1675965362",
"inclusionPromise": {
"signedEntryTimestamp": "MEQCIEM1cnSu6sdPpTZvs2XKUGcyKR+ygz4VoOgxcXVLNy5cAiAVJEOd9duLUkVFTfz7fEJdOOEF6RA1xUe6IiPJeZZ5OQ=="
},
"inclusionProof": null,
"canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjIiLCJraW5kIjoiaW50b3RvIiwic3BlYyI6eyJjb250ZW50Ijp7ImVudmVsb3BlIjp7InBheWxvYWRUeXBlIjoiYXBwbGljYXRpb24vdm5kLmluLXRvdG8ranNvbiIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLCJwdWJsaWNLZXkiOiJMUzB0TFMxQ1JVZEpUaUJRVlVKTVNVTWdTMFZaTFMwdExTMEtUVVpyZDBWM1dVaExiMXBKZW1vd1EwRlJXVWxMYjFwSmVtb3dSRUZSWTBSUlowRkZNVTlzWWpONlRVRkdSbmhZUzBocFNXdFJUelZqU2pOWmFHdzFhVFpWVUhBclNXaDFkR1ZDU21KMVNHTkJOVlZ2WjB0dk1FVlhkR3hYZDFjMlMxTmhTMjlVVGtWWlREZEtiRU5SYVZadWEyaENhM1JWWjJjOVBRb3RMUzB0TFVWT1JDQlFWVUpNU1VNZ1MwVlpMUzB0TFMwPSIsInNpZyI6IlRVVlpRMGxSUkRremJXZG5VbTVzZVRkdVpWVjFkVGRGTHpWTVJUbHJNRTR6V0d0UmRXMDJSRzVFVkhaRGEwTk1ZMUZKYUVGT1dUY3llaXR1YTI4eVpFZFpObkJzSzBReGVTOUpWR2RPVEZwNGMwWlhRVmt3WTJocVYyczNVRlpKIn1dfSwiaGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjcyNzUyMjliMTk3YjllYWRlNDAyNjQ5Y2VmYTIzZGI5ZGM0N2FjNjVmOGExMzVjNDA5OTJhNmEwMDQyN2JhODYifSwicGF5bG9hZEhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI2ZDM2OTdiZDVmYmVkNTZkZTYwYWU5Y2Y1MmY4NjA4Yjk2M2I2N2FjYTZkY2NhMzZmOTMwZTlhN2ZiNWEyYjkzIn19fX0="
}
],
"timestampVerificationData": null
},
"dsseEnvelope": {
"payload": "eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInN1YmplY3QiOlt7Im5hbWUiOiJwa2c6bnBtL3NpZ3N0b3JlQDEuMC4wIiwiZGlnZXN0Ijp7InNoYTUxMiI6IjdiZWE5ZjZlN2ZmMzdmNWZhYjBiMzZiZjA2MTIwMGZmZjAzMDk5ZmQyZmQ2OTZiOTFkMDRiYzVlNGYyMjVlYjlmZDZlMGNhZGNhZDU0YmE5ODBmNDNmYjM1MmE5OWU4ODEwYjRlMGFiZWI1YzBlZjJjZjkxMDhjZDFmMjU4YjM2In19XSwicHJlZGljYXRlVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vYXR0ZXN0YXRpb24vdHJlZS9tYWluL3NwZWNzL3B1Ymxpc2gvdjAuMSIsInByZWRpY2F0ZSI6eyJuYW1lIjoic2lnc3RvcmUiLCJ2ZXJzaW9uIjoiMS4wLjAiLCJyZWdpc3RyeSI6Imh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnIn19",
"payloadType": "application/vnd.in-toto+json",
"signatures": [
{
"sig": "MEYCIQD93mggRnly7neUuu7E/5LE9k0N3XkQum6DnDTvCkCLcQIhANY72z+nko2dGY6pl+D1y/ITgNLZxsFWAY0chjWk7PVI",
"keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"
}
]
}
}
}
]
}

View File

@ -0,0 +1,94 @@
{
"attestations": [
{
"predicateType": "https://slsa.dev/provenance/v0.2",
"bundle": {
"mediaType": "application/vnd.dev.sigstore.bundle+json;version=0.1",
"verificationMaterial": {
"x509CertificateChain": {
"certificates": [
{
"rawBytes": "MIIDpTCCAy2gAwIBAgIUJ+i+7rcd4wcBtySOuMjY44WEmwowCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjMwMjA5MTczODI1WhcNMjMwMjA5MTc0ODI1WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFi++0ByDdgt/NKMD6tSL4xT4tGZZASdRjIzyujxOjpuDXGq08ZeD8eUf7gZCwCreaIX7rHAYaXvbQ3nA4N6ZmqOCAkwwggJIMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUGmX4ev4tH52Fw5NYiuFtCT6fA3YwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8waQYDVR0RAQH/BF8wXYZbaHR0cHM6Ly9naXRodWIuY29tL3RoZXVwZGF0ZWZyYW1ld29yay90dWYtanMvLmdpdGh1Yi93b3JrZmxvd3MvcHVibGlzaC55bWxAcmVmcy90YWdzL3YxLjAuMDA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMBUGCisGAQQBg78wAQIEB3JlbGVhc2UwNgYKKwYBBAGDvzABAwQoOTk2MjRjYzdjZTM5ODcyZTZiZDA4YTBkZjU5MjI5YTQ4NTYyZGJjYTAVBgorBgEEAYO/MAEEBAdwdWJsaXNoMCcGCisGAQQBg78wAQUEGXRoZXVwZGF0ZWZyYW1ld29yay90dWYtanMwHgYKKwYBBAGDvzABBgQQcmVmcy90YWdzL3YxLjAuMDCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABhjdB0GwAAAQDAEgwRgIhAMvULg3+C9MFZgTjWpEGUX5Jw5m5AizP/mlI/0/SOpRcAiEA4RI3jDcgP6Nwx2j++b1T7d7wPfdyFOueDcN3SURsdmUwCgYIKoZIzj0EAwMDZgAwYwIwOcN18RrQ26tEe1lDdQJi7XEtXA5fzKzWxkjo+Ll4HrLuAjWTiQvy6ABkzHL/oNzsAi8mWhNn5ncF3BCF0riMwy1h2Y3owpPilvL+wmdMOe59wzbycQ5AYbSLkY50amCFJQ=="
},
{
"rawBytes": "MIICGjCCAaGgAwIBAgIUALnViVfnU0brJasmRkHrn/UnfaQwCgYIKoZIzj0EAwMwKjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MREwDwYDVQQDEwhzaWdzdG9yZTAeFw0yMjA0MTMyMDA2MTVaFw0zMTEwMDUxMzU2NThaMDcxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEeMBwGA1UEAxMVc2lnc3RvcmUtaW50ZXJtZWRpYXRlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE8RVS/ysH+NOvuDZyPIZtilgUF9NlarYpAd9HP1vBBH1U5CV77LSS7s0ZiH4nE7Hv7ptS6LvvR/STk798LVgMzLlJ4HeIfF3tHSaexLcYpSASr1kS0N/RgBJz/9jWCiXno3sweTAOBgNVHQ8BAf8EBAMCAQYwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU39Ppz1YkEZb5qNjpKFWixi4YZD8wHwYDVR0jBBgwFoAUWMAeX5FFpWapesyQoZMi0CrFxfowCgYIKoZIzj0EAwMDZwAwZAIwPCsQK4DYiZYDPIaDi5HFKnfxXx6ASSVmERfsynYBiX2X6SJRnZU84/9DZdnFvvxmAjBOt6QpBlc4J/0DxvkTCqpclvziL6BCCPnjdlIB3Pu3BxsPmygUY7Ii2zbdCdliiow="
},
{
"rawBytes": "MIIB9zCCAXygAwIBAgIUALZNAPFdxHPwjeDloDwyYChAO/4wCgYIKoZIzj0EAwMwKjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MREwDwYDVQQDEwhzaWdzdG9yZTAeFw0yMTEwMDcxMzU2NTlaFw0zMTEwMDUxMzU2NThaMCoxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjERMA8GA1UEAxMIc2lnc3RvcmUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAT7XeFT4rb3PQGwS4IajtLk3/OlnpgangaBclYpsYBr5i+4ynB07ceb3LP0OIOZdxexX69c5iVuyJRQ+Hz05yi+UF3uBWAlHpiS5sh0+H2GHE7SXrk1EC5m1Tr19L9gg92jYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRYwB5fkUWlZql6zJChkyLQKsXF+jAfBgNVHSMEGDAWgBRYwB5fkUWlZql6zJChkyLQKsXF+jAKBggqhkjOPQQDAwNpADBmAjEAj1nHeXZp+13NWBNa+EDsDP8G1WWg1tCMWP/WHPqpaVo0jhsweNFZgSs0eE7wYI4qAjEA2WB9ot98sIkoF3vZYdd3/VtWB5b9TNMea7Ix/stJ5TfcLLeABLE4BNJOsQ4vnBHJ"
}
]
},
"tlogEntries": [
{
"logIndex": "12987347",
"logId": {
"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="
},
"kindVersion": {
"kind": "intoto",
"version": "0.0.2"
},
"integratedTime": "1675964305",
"inclusionPromise": {
"signedEntryTimestamp": "MEUCIQCicS3b1znpUuLI8LqtewqsHkfJUNV9cUvomA2L+Ni+4AIgEN7IKk+J3P2F9wDtrgXqp1lObLKCJG/hnfIqtqw6Z2Y="
},
"inclusionProof": null,
"canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjIiLCJraW5kIjoiaW50b3RvIiwic3BlYyI6eyJjb250ZW50Ijp7ImVudmVsb3BlIjp7InBheWxvYWRUeXBlIjoiYXBwbGljYXRpb24vdm5kLmluLXRvdG8ranNvbiIsInNpZ25hdHVyZXMiOlt7InB1YmxpY0tleSI6IkxTMHRMUzFDUlVkSlRpQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENrMUpTVVJ3VkVORFFYa3laMEYzU1VKQlowbFZTaXRwS3pkeVkyUTBkMk5DZEhsVFQzVk5hbGswTkZkRmJYZHZkME5uV1VsTGIxcEplbW93UlVGM1RYY0tUbnBGVmsxQ1RVZEJNVlZGUTJoTlRXTXliRzVqTTFKMlkyMVZkVnBIVmpKTlVqUjNTRUZaUkZaUlVVUkZlRlo2WVZka2VtUkhPWGxhVXpGd1ltNVNiQXBqYlRGc1drZHNhR1JIVlhkSWFHTk9UV3BOZDAxcVFUVk5WR042VDBSSk1WZG9ZMDVOYWsxM1RXcEJOVTFVWXpCUFJFa3hWMnBCUVUxR2EzZEZkMWxJQ2t0dldrbDZhakJEUVZGWlNVdHZXa2w2YWpCRVFWRmpSRkZuUVVWR2FTc3JNRUo1UkdSbmRDOU9TMDFFTm5SVFREUjRWRFIwUjFwYVFWTmtVbXBKZW5rS2RXcDRUMnB3ZFVSWVIzRXdPRnBsUkRobFZXWTNaMXBEZDBOeVpXRkpXRGR5U0VGWllWaDJZbEV6YmtFMFRqWmFiWEZQUTBGcmQzZG5aMHBKVFVFMFJ3cEJNVlZrUkhkRlFpOTNVVVZCZDBsSVowUkJWRUpuVGxaSVUxVkZSRVJCUzBKblozSkNaMFZHUWxGalJFRjZRV1JDWjA1V1NGRTBSVVpuVVZWSGJWZzBDbVYyTkhSSU5USkdkelZPV1dsMVJuUkRWRFptUVROWmQwaDNXVVJXVWpCcVFrSm5kMFp2UVZVek9WQndlakZaYTBWYVlqVnhUbXB3UzBaWGFYaHBORmtLV2tRNGQyRlJXVVJXVWpCU1FWRklMMEpHT0hkWVdWcGlZVWhTTUdOSVRUWk1lVGx1WVZoU2IyUlhTWFZaTWpsMFRETlNiMXBZVm5kYVIwWXdXbGRhZVFwWlZ6RnNaREk1ZVdGNU9UQmtWMWwwWVc1TmRreHRaSEJrUjJneFdXazVNMkl6U25KYWJYaDJaRE5OZG1OSVZtbGlSMng2WVVNMU5XSlhlRUZqYlZadENtTjVPVEJaVjJSNlRETlplRXhxUVhWTlJFRTFRbWR2Y2tKblJVVkJXVTh2VFVGRlFrSkRkRzlrU0ZKM1kzcHZka3d6VW5aaE1sWjFURzFHYW1SSGJIWUtZbTVOZFZveWJEQmhTRlpwWkZoT2JHTnRUblppYmxKc1ltNVJkVmt5T1hSTlFsVkhRMmx6UjBGUlVVSm5OemgzUVZGSlJVSXpTbXhpUjFab1l6SlZkd3BPWjFsTFMzZFpRa0pCUjBSMmVrRkNRWGRSYjA5VWF6Sk5hbEpxV1hwa2FscFVUVFZQUkdONVdsUmFhVnBFUVRSWlZFSnJXbXBWTlUxcVNUVlpWRkUwQ2s1VVdYbGFSMHBxV1ZSQlZrSm5iM0pDWjBWRlFWbFBMMDFCUlVWQ1FXUjNaRmRLYzJGWVRtOU5RMk5IUTJselIwRlJVVUpuTnpoM1FWRlZSVWRZVW04S1dsaFdkMXBIUmpCYVYxcDVXVmN4YkdReU9YbGhlVGt3WkZkWmRHRnVUWGRJWjFsTFMzZFpRa0pCUjBSMmVrRkNRbWRSVVdOdFZtMWplVGt3V1Zka2VncE1NMWw0VEdwQmRVMUVRMEpwZDFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT1VKSWMwRmxVVUl6UVU0d09VMUhja2Q0ZUVWNVdYaHJaVWhLYkc1T2QwdHBDbE5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtaHFaRUl3UjNkQlFVRlJSRUZGWjNkU1owbG9RVTEyVlV4bk15dERPVTFHV21kVWFsZHdSVWNLVlZnMVNuYzFiVFZCYVhwUUwyMXNTUzh3TDFOUGNGSmpRV2xGUVRSU1NUTnFSR05uVURaT2QzZ3lhaXNyWWpGVU4yUTNkMUJtWkhsR1QzVmxSR05PTXdwVFZWSnpaRzFWZDBObldVbExiMXBKZW1vd1JVRjNUVVJhWjBGM1dYZEpkMDlqVGpFNFVuSlJNalowUldVeGJFUmtVVXBwTjFoRmRGaEJOV1o2UzNwWENuaHJhbThyVEd3MFNISk1kVUZxVjFScFVYWjVOa0ZDYTNwSVRDOXZUbnB6UVdrNGJWZG9UbTQxYm1OR00wSkRSakJ5YVUxM2VURm9NbGt6YjNkd1VHa0tiSFpNSzNkdFpFMVBaVFU1ZDNwaWVXTlJOVUZaWWxOTWExazFNR0Z0UTBaS1VUMDlDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsiLCJzaWciOiJUVVZWUTBsQ1JtOUljbWhEU0dGWWFFbFFZakprV2pOU01FZHRORTR4VldkNmRrVnlkamxzWjNJdlZXRlJVbTFsUVdsRlFUaDFOVkpTUlRnMk5sbDRTV0Z2T1ZOc2NGZEhWVTV0Vld4cmNrZHdWWFZyTUVkSWNtSnBSSGR0YTBFOSJ9XX0sImhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI3OWIyN2U3Zjg3NmJhY2FiMWE2YjkxZDA2MWYxMTBhOWUxYjkxODZkN2M0YmI5ZjU5ZWMyODM5MTY5OTQzZmMxIn0sInBheWxvYWRIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiZDNjOWFhNjQxMjBhNWY0Y2Y2ZWY3MzFmMDNhNmRlNGFiZmVhNjUxYzhlOWQ4NzAyYTM4NTI2MzZjY2ZiZTc0ZSJ9fX19"
}
],
"timestampVerificationData": null
},
"dsseEnvelope": {
"payload": "eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInN1YmplY3QiOlt7Im5hbWUiOiJwa2c6bnBtL3R1Zi1qc0AxLjAuMCIsImRpZ2VzdCI6eyJzaGE1MTIiOiJkNWRjNmM0MzAxMTIwZjMwMDIyNjM0ZGQ2MDc0MzhjMDlkNWZmZTg3ZmI4YzAyZDYyOWYyNDQxZDIwNTY1MTAwN2ZlNTQ0Yzk1MzFmNTI1YmExODc1ZTllMjY2NzUyYWY3NDE0NDkwYTkxYTNiMmNhMGYxNDY4Yjg4NmZjM2NmYyJ9fV0sInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInByZWRpY2F0ZSI6eyJidWlsZFR5cGUiOiJodHRwczovL2dpdGh1Yi5jb20vbnBtL2NsaS9naGFAdjAiLCJidWlsZGVyIjp7ImlkIjoiaHR0cHM6Ly9naXRodWIuY29tL25wbS9jbGlAOS40LjIifSwiaW52b2NhdGlvbiI6eyJjb25maWdTb3VyY2UiOnsidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS90aGV1cGRhdGVmcmFtZXdvcmsvdHVmLWpzQHJlZnMvdGFncy92MS4wLjAiLCJkaWdlc3QiOnsic2hhMSI6Ijk5NjI0Y2M3Y2UzOTg3MmU2YmQwOGEwZGY1OTIyOWE0ODU2MmRiY2EifSwiZW50cnlQb2ludCI6InRoZXVwZGF0ZWZyYW1ld29yay90dWYtanMvLmdpdGh1Yi93b3JrZmxvd3MvcHVibGlzaC55bWxAcmVmcy90YWdzL3YxLjAuMCJ9LCJwYXJhbWV0ZXJzIjp7fSwiZW52aXJvbm1lbnQiOnsiR0lUSFVCX0FDVE9SX0lEIjoiMzk4MDI3IiwiR0lUSFVCX0VWRU5UX05BTUUiOiJyZWxlYXNlIiwiR0lUSFVCX1JFRiI6InJlZnMvdGFncy92MS4wLjAiLCJHSVRIVUJfUkVGX1RZUEUiOiJ0YWciLCJHSVRIVUJfUkVQT1NJVE9SWSI6InRoZXVwZGF0ZWZyYW1ld29yay90dWYtanMiLCJHSVRIVUJfUkVQT1NJVE9SWV9JRCI6IjUyOTQzMTAwNyIsIkdJVEhVQl9SRVBPU0lUT1JZX09XTkVSX0lEIjoiNDYzMzAyOCIsIkdJVEhVQl9SVU5fQVRURU1QVCI6IjEiLCJHSVRIVUJfUlVOX0lEIjoiNDEzNjkwMjkxOCIsIkdJVEhVQl9SVU5fTlVNQkVSIjoiMTAiLCJHSVRIVUJfU0hBIjoiOTk2MjRjYzdjZTM5ODcyZTZiZDA4YTBkZjU5MjI5YTQ4NTYyZGJjYSIsIkdJVEhVQl9XT1JLRkxPV19SRUYiOiJ0aGV1cGRhdGVmcmFtZXdvcmsvdHVmLWpzLy5naXRodWIvd29ya2Zsb3dzL3B1Ymxpc2gueW1sQHJlZnMvdGFncy92MS4wLjAiLCJHSVRIVUJfV09SS0ZMT1dfU0hBIjoiOTk2MjRjYzdjZTM5ODcyZTZiZDA4YTBkZjU5MjI5YTQ4NTYyZGJjYSJ9fSwibWV0YWRhdGEiOnsiYnVpbGRJbnZvY2F0aW9uSWQiOiI0MTM2OTAyOTE4LTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6ZmFsc2UsImVudmlyb25tZW50IjpmYWxzZSwibWF0ZXJpYWxzIjpmYWxzZX0sInJlcHJvZHVjaWJsZSI6ZmFsc2V9LCJtYXRlcmlhbHMiOlt7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vdGhldXBkYXRlZnJhbWV3b3JrL3R1Zi1qcyIsImRpZ2VzdCI6eyJzaGExIjoiOTk2MjRjYzdjZTM5ODcyZTZiZDA4YTBkZjU5MjI5YTQ4NTYyZGJjYSJ9fV19fQ==",
"payloadType": "application/vnd.in-toto+json",
"signatures": [
{
"sig": "MEUCIBFoHrhCHaXhIPb2dZ3R0Gm4N1UgzvErv9lgr/UaQRmeAiEA8u5RRE866YxIao9SlpWGUNmUlkrGpUuk0GHrbiDwmkA=",
"keyid": ""
}
]
}
}
},
{
"predicateType": "https://github.com/npm/attestation/tree/main/specs/publish/v0.1",
"bundle": {
"mediaType": "application/vnd.dev.sigstore.bundle+json;version=0.1",
"verificationMaterial": {
"publicKey": {
"hint": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"
},
"tlogEntries": [
{
"logIndex": "12987349",
"logId": {
"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="
},
"kindVersion": {
"kind": "intoto",
"version": "0.0.2"
},
"integratedTime": "1675964307",
"inclusionPromise": {
"signedEntryTimestamp": "MEUCIC4eHozZ9PAd5OmOCB0uzDT2gz3VWBN47+CyFavOrkL3AiEAzlK562Nf4B3yQdjztSDHpwOATAs4sJGh9WPGQ6u0hNQ="
},
"inclusionProof": null,
"canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjIiLCJraW5kIjoiaW50b3RvIiwic3BlYyI6eyJjb250ZW50Ijp7ImVudmVsb3BlIjp7InBheWxvYWRUeXBlIjoiYXBwbGljYXRpb24vdm5kLmluLXRvdG8ranNvbiIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLCJwdWJsaWNLZXkiOiJMUzB0TFMxQ1JVZEpUaUJRVlVKTVNVTWdTMFZaTFMwdExTMEtUVVpyZDBWM1dVaExiMXBKZW1vd1EwRlJXVWxMYjFwSmVtb3dSRUZSWTBSUlowRkZNVTlzWWpONlRVRkdSbmhZUzBocFNXdFJUelZqU2pOWmFHdzFhVFpWVUhBclNXaDFkR1ZDU21KMVNHTkJOVlZ2WjB0dk1FVlhkR3hYZDFjMlMxTmhTMjlVVGtWWlREZEtiRU5SYVZadWEyaENhM1JWWjJjOVBRb3RMUzB0TFVWT1JDQlFWVUpNU1VNZ1MwVlpMUzB0TFMwPSIsInNpZyI6IlRVVlpRMGxSUkZaalVuUnZRVTh2VVZoWmMxUnVPRE5qTkhkcUwyZ3lXU3NyUVdsRlRXVk1ORUZrWkVkeWJGZHdZbWRKYUVGTE9WUTVWemg1Y21scFQzVnRWa1J1YW5KelRrSTJlakZQZDB0cmVuQjZSbkY1VDJKbVFVaDVkM0pUIn1dfSwiaGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjUzYzkxZWJhZDE5YzY0ODYxZTlmMWRkODBkYjhiNGQyMDFjZjYwMzI0NTk1NjUxZmVhYWVmNzQzMWE2ZGEwMGEifSwicGF5bG9hZEhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIwZTExMWI4MzUxNTQ0OTJlYjQwMjZiY2M4ZDUyZmUzZGNhMzc5ODRkMWE1NDQxZGU5ODg4NTdlODk1N2Q1YTgzIn19fX0="
}
],
"timestampVerificationData": null
},
"dsseEnvelope": {
"payload": "eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInN1YmplY3QiOlt7Im5hbWUiOiJwa2c6bnBtL3R1Zi1qc0AxLjAuMCIsImRpZ2VzdCI6eyJzaGE1MTIiOiJkNWRjNmM0MzAxMTIwZjMwMDIyNjM0ZGQ2MDc0MzhjMDlkNWZmZTg3ZmI4YzAyZDYyOWYyNDQxZDIwNTY1MTAwN2ZlNTQ0Yzk1MzFmNTI1YmExODc1ZTllMjY2NzUyYWY3NDE0NDkwYTkxYTNiMmNhMGYxNDY4Yjg4NmZjM2NmYyJ9fV0sInByZWRpY2F0ZVR5cGUiOiJodHRwczovL2dpdGh1Yi5jb20vbnBtL2F0dGVzdGF0aW9uL3RyZWUvbWFpbi9zcGVjcy9wdWJsaXNoL3YwLjEiLCJwcmVkaWNhdGUiOnsibmFtZSI6InR1Zi1qcyIsInZlcnNpb24iOiIxLjAuMCIsInJlZ2lzdHJ5IjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcifX0=",
"payloadType": "application/vnd.in-toto+json",
"signatures": [
{
"sig": "MEYCIQDVcRtoAO/QXYsTn83c4wj/h2Y++AiEMeL4AddGrlWpbgIhAK9T9W8yriiOumVDnjrsNB6z1OwKkzpzFqyObfAHywrS",
"keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"
}
]
}
}
}
]
}

27
deps/npm/test/fixtures/tmock.js vendored Normal file
View File

@ -0,0 +1,27 @@
const path = require('node:path')
const ROOT = path.resolve(__dirname, '../..')
const BIN = path.join(ROOT, 'bin')
const LIB = path.join(ROOT, 'lib')
// since mock npm changes directories it can be hard to figure out the
// correct path to mock something with tap since the directory will change
// before/after npm is loaded. This helper replaces {BIN} and {LIB} with
// the absolute path to those directories
const replace = (s) => {
if (/^[./{]/.test(s)) {
return s
.replace(/^\{BIN\}/, BIN)
.replace(/^\{LIB\}/, LIB)
.replace(/^\{ROOT\}/, ROOT)
} else {
return require.resolve(s)
}
}
const tmock = (t, p, mocks = {}) => {
const entries = Object.entries(mocks).map(([k, v]) => [replace(k), v])
return t.mock(replace(p), Object.fromEntries(entries))
}
module.exports = tmock

17
deps/npm/test/fixtures/tnock.js vendored Normal file
View File

@ -0,0 +1,17 @@
'use strict'
const nock = require('nock')
// Uncomment this to find requests that aren't matching
// nock.emitter.on('no match', req => console.log(req.options))
module.exports = tnock
function tnock (t, host, opts) {
nock.disableNetConnect()
const server = nock(host, opts)
t.teardown(function () {
nock.enableNetConnect()
server.done()
})
return server
}

16
deps/npm/test/fixtures/tspawk.js vendored Normal file
View File

@ -0,0 +1,16 @@
'use strict'
const spawk = require('spawk')
module.exports = tspawk
function tspawk (t) {
spawk.preventUnmatched()
t.teardown(function () {
spawk.unload()
})
t.afterEach(function () {
spawk.done()
})
return spawk
}