Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(view): dont unwrap arrays in json mode #7506

Merged
merged 1 commit into from
May 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions lib/commands/view.js
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ class View extends BaseCommand {
}

async getData (pkg, args) {
const json = this.npm.config.get('json')
const opts = {
...this.npm.flatOptions,
preferOnline: true,
Expand Down Expand Up @@ -228,7 +229,12 @@ class View extends BaseCommand {
delete versions[v].readme
}

data.push(showFields(pckmnt, versions[v], arg))
data.push(showFields({
data: pckmnt,
version: versions[v],
fields: arg,
json,
}))
})
}
})
Expand All @@ -242,11 +248,7 @@ class View extends BaseCommand {
throw er
}

if (
!this.npm.config.get('json') &&
args.length === 1 &&
args[0] === ''
) {
if (!json && args.length === 1 && args[0] === '') {
pckmnt.version = version
}

Expand Down Expand Up @@ -432,7 +434,7 @@ function reducer (acc, cur) {
}

// return whatever was printed
function showFields (data, version, fields) {
function showFields ({ data, version, fields, json }) {
const o = {}
;[data, version].forEach((s) => {
Object.keys(s).forEach((k) => {
Expand All @@ -441,7 +443,7 @@ function showFields (data, version, fields) {
})

const queryable = new Queryable(o)
const s = queryable.query(fields)
const s = queryable.query(fields, { unwrapSingleItemArrays: !json })
const res = { [version.version]: s }

if (s) {
Expand Down
8 changes: 4 additions & 4 deletions lib/utils/queryable.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ const parseKeys = key => {
return res
}

const getter = ({ data, key }) => {
const getter = ({ data, key }, { unwrapSingleItemArrays = true } = {}) => {
// keys are a list in which each entry represents the name of
// a property that should be walked through the object in order to
// return the final found value
Expand Down Expand Up @@ -122,7 +122,7 @@ const getter = ({ data, key }) => {

// these are some legacy expectations from
// the old API consumed by lib/view.js
if (Array.isArray(_data) && _data.length <= 1) {
if (unwrapSingleItemArrays && Array.isArray(_data) && _data.length <= 1) {
_data = _data[0]
}

Expand Down Expand Up @@ -243,7 +243,7 @@ class Queryable {
this.#data = obj
}

query (queries) {
query (queries, opts) {
// this ugly interface here is meant to be a compatibility layer
// with the legacy API lib/view.js is consuming, if at some point
// we refactor that command then we can revisit making this nicer
Expand All @@ -255,7 +255,7 @@ class Queryable {
getter({
data: this.#data,
key: query,
})
}, opts)

if (Array.isArray(queries)) {
let res = {}
Expand Down
19 changes: 19 additions & 0 deletions tap-snapshots/test/lib/commands/view.js.test.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,25 @@ dist-tags:
published over a year from now
`

exports[`test/lib/commands/view.js TAP package with single version full json > must match snapshot 1`] = `
{
"_id": "single-version",
"name": "single-version",
"dist-tags": {
"latest": "1.0.0"
},
"versions": [
"1.0.0"
],
"version": "1.0.0",
"dist": {
"shasum": "123",
"tarball": "http://hm.single-version.com/1.0.0.tgz",
"fileCount": 1
}
}
`

exports[`test/lib/commands/view.js TAP specific field names array field - 1 element > must match snapshot 1`] = `
claudia
`
Expand Down
39 changes: 39 additions & 0 deletions test/lib/commands/view.js
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,24 @@ const packument = (nv, opts) => {
},
},
},
'single-version': {
_id: 'single-version',
name: 'single-version',
'dist-tags': {
latest: '1.0.0',
},
versions: {
'1.0.0': {
name: 'single-version',
version: '1.0.0',
dist: {
shasum: '123',
tarball: 'http://hm.single-version.com/1.0.0.tgz',
fileCount: 1,
},
},
},
},
}
if (nv.type === 'git') {
return mocks[nv.hosted.project]
Expand Down Expand Up @@ -357,6 +375,27 @@ t.test('package with --json and no versions', async t => {
t.equal(joinedOutput(), '', 'no info to display')
})

t.test('package with single version', async t => {
t.test('full json', async t => {
const { view, joinedOutput } = await loadMockNpm(t, { config: { json: true } })
await view.exec(['single-version'])
t.matchSnapshot(joinedOutput())
})

t.test('json and versions arg', async t => {
const { view, joinedOutput } = await loadMockNpm(t, { config: { json: true } })
await view.exec(['single-version', 'versions'])
const parsed = JSON.parse(joinedOutput())
t.strictSame(parsed, ['1.0.0'], 'does not unwrap single item arrays in json')
})

t.test('no json and versions arg', async t => {
const { view, joinedOutput } = await loadMockNpm(t, { config: { json: false } })
await view.exec(['single-version', 'versions'])
t.strictSame(joinedOutput(), '1.0.0', 'unwraps single item arrays in basic mode')
})
})

t.test('package in cwd', async t => {
const prefixDir = {
'package.json': JSON.stringify({
Expand Down
Loading