(bucketName, listParams, list)
| 102 | */ |
| 103 | |
| 104 | function processVersions(bucketName, listParams, list) { |
| 105 | const xml = []; |
| 106 | xml.push( |
| 107 | '<?xml version="1.0" encoding="UTF-8"?>', |
| 108 | '<ListVersionsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">', |
| 109 | '<Name>', bucketName, '</Name>' |
| 110 | ); |
| 111 | const isTruncated = list.IsTruncated ? 'true' : 'false'; |
| 112 | const xmlParams = [ |
| 113 | { tag: 'Prefix', value: listParams.prefix }, |
| 114 | { tag: 'KeyMarker', value: listParams.keyMarker }, |
| 115 | { tag: 'VersionIdMarker', value: listParams.versionIdMarker }, |
| 116 | { tag: 'NextKeyMarker', value: list.NextKeyMarker }, |
| 117 | { tag: 'NextVersionIdMarker', value: list.NextVersionIdMarker }, |
| 118 | { tag: 'MaxKeys', value: listParams.maxKeys }, |
| 119 | { tag: 'Delimiter', value: listParams.delimiter }, |
| 120 | { tag: 'EncodingType', value: listParams.encoding }, |
| 121 | { tag: 'IsTruncated', value: isTruncated }, |
| 122 | ]; |
| 123 | |
| 124 | const escapeXmlFn = listParams.encoding === 'url' ? querystring.escape : escapeForXml; |
| 125 | xmlParams.forEach(p => { |
| 126 | if (p.value) { |
| 127 | const val = p.tag !== 'NextVersionIdMarker' || p.value === 'null' ? |
| 128 | p.value : |
| 129 | versionIdUtils.encode(p.value); |
| 130 | xml.push(`<${p.tag}>${escapeXmlFn(val)}</${p.tag}>`); |
| 131 | } |
| 132 | }); |
| 133 | let lastKey = listParams.keyMarker ? escapeXmlFn(listParams.keyMarker) : undefined; |
| 134 | list.Versions.forEach(item => { |
| 135 | const v = item.value; |
| 136 | const objectKey = escapeXmlFn(item.key); |
| 137 | const isLatest = lastKey !== objectKey; |
| 138 | lastKey = objectKey; |
| 139 | |
| 140 | xml.push( |
| 141 | v.IsDeleteMarker ? '<DeleteMarker>' : '<Version>', |
| 142 | `<Key>${objectKey}</Key>`, |
| 143 | '<VersionId>', |
| 144 | (v.IsNull || v.VersionId === undefined) ? |
| 145 | 'null' |
| 146 | : versionIdUtils.encode(v.VersionId), |
| 147 | '</VersionId>', |
| 148 | `<IsLatest>${isLatest}</IsLatest>`, |
| 149 | `<LastModified>${v.LastModified}</LastModified>`, |
| 150 | `<ETag>"${v.ETag}"</ETag>`, |
| 151 | `<Size>${v.Size}</Size>`, |
| 152 | '<Owner>', |
| 153 | `<ID>${v.Owner.ID}</ID>`, |
| 154 | `<DisplayName>${v.Owner.DisplayName}</DisplayName>`, |
| 155 | '</Owner>', |
| 156 | ); |
| 157 | |
| 158 | if (!v.IsDeleteMarker) { |
| 159 | buildAttributesXml(v, v.userMetadata, listParams.optionalAttributes, xml); |
| 160 | } |
| 161 |
no test coverage detected