-
Notifications
You must be signed in to change notification settings - Fork 0
/
convert.js
245 lines (228 loc) · 6.94 KB
/
convert.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
import {
fallbackIfFails,
isArr,
isArrLike,
isHex,
isObj,
isStr,
isUint8Arr
} from './utils'
/*
* List of optional node-modules and the functions used by them:
* Module Name : Function Name
* ---------------------------
* @polkadot/util : bytesToHex, hexToBytes, strToU8a, u8aToStr
* @polkadot/util-crypto: ss58Decode, ss58Encode
*/
export const decodeUTF8 = strToU8a // ToDo: deprecate
export const encodeUTF8 = u8aToStr // ToDo: deprecate
/**
* @name addressToStr
* @summary Converts to address bytes to string
*
* @param {String|Uint8Array} address
*
* @returns {String} If invalid address returns empty string.
*/
export const addressToStr = (address, ignoreChecksum, ss58Format) => fallbackIfFails(
ss58Encode,
[address, ss58Format],
'',
)
/**
* @name bytesToHex
*
* @param {Uint32List} bytes
*
* @returns {String}
*/
export const bytesToHex = bytes => {
// no need to convert
if (isHex(bytes)) return bytes
const { u8aToHex } = require('@polkadot/util')
return fallbackIfFails(u8aToHex, [bytes])
}
/**
* @name csvToArrr
* @summary Convert CSV/TSV (Comma/Tab Seprated Value) string to Array
*
* @param {String} str
* @param {Array} columnTitles (optional)
* if null, indicates no column title to be used
* if undefined, will use first line as column title
* @param {String} separator line text separator
*
* @returns {Map} exactly the same number of items as the number of columns.
* Each item will be an array consisting of all column cells.
* If `columnTitles` not supplied, first cell of each column will be used as key
* and be excluded from item value array.
*/
export const csvToArr = (str, columnTitles, separator = ',') => {
const lines = str.split('\n').map(line => line.replace('\r', ''))
const ignoreFirst = !isArr(columnTitles) || columnTitles.length === 0
const keys = !ignoreFirst ? columnTitles : (lines[0] || '').split(separator)
return lines
.slice(ignoreFirst ? 1 : 0)
.map(line => {
const cells = line.split(separator)
// ignore empty line
if (cells.join('').trim() === '') return
// convert array to object with column titles as respective keys
return cells.reduce((obj, str, i) => {
obj[keys[i]] = str
return obj
}, {})
})
.filter(Boolean)
}
/**
* @name csvToMap
* @summary Convert CSV/TSV (Comma/Tab Seprated Value) string to Map
*
* @param {String} str
* @param {Array} columnTitles (optional)
* if null, indicates no column title to be used
* if undefined, will use first line as column title
* @param {String} separator line text separator
*
* @returns {Map} exactly the same number of items as the number of columns.
* Each item will be an array consisting of all column cells.
* If `columnTitles` not supplied, first cell of each column will be used as key
* and be excluded from item value array.
*/
export const csvToMap = (str, columnTitles, separator = ',') => {
const result = new Map()
const lines = str.split('\n').map(line => line.replace('\r', ''))
const ignoreFirst = !isArr(columnTitles) || columnTitles.length === 0
const titles = !ignoreFirst ? columnTitles : lines[0].split(separator)
lines.slice(ignoreFirst ? 1 : 0)
.forEach(line => {
const cells = line.split(separator)
// ignore empty line
if (cells.join('').trim() === '') return
cells.forEach((text, i) => {
if (!titles[i]) return
const columnTexts = result.get(titles[i]) || []
columnTexts.push(text)
result.set(titles[i], columnTexts)
})
})
return result
}
/**
* @name hexToBytes
* @summary convert hex string to bytes array
*
* @param {String} hex
* @param {Number} bitLength
*
* @returns {Uint8Array}
*/
export const hexToBytes = (hex, bitLength) => {
// no need to convert
if (isUint8Arr(hex)) return hex
const { hexToU8a } = require('@polkadot/util')
return fallbackIfFails(hexToU8a, [
isStr(hex) && !hex.startsWith('0x')
? '0x' + hex
: hex,
bitLength,
])
}
/**
* @name hexToStr
*
* @param {String} hex
*
* @returns {String}
*/
export const hexToStr = hex => {
if (!`${hex}`.startsWith('0x')) hex = `0x${hex}`
if (!isHex(hex)) return ''
const { hexToString } = require('@polkadot/util')
return hexToString(hex)
}
/**
* @name ss58Encode
* @summary convert identity/address from bytes to string
*
* @param {Uint8Array} address
* @param {Number} ss58Format (optional) use to generate address for any supported parachain identity.
* Default: undefined
*
* @returns {String} null if invalid address supplied
*/
export const ss58Encode = (address, ss58Format) => {
const { encodeAddress } = require('@polkadot/util-crypto')
return fallbackIfFails(encodeAddress, [address, ss58Format])
}
/**
* @name ss58Decode
* @summary convert identity/address from string to bytes
*
* @param {String} address
*
* @returns {Uint8Array} null if invalid address supplied
*/
export const ss58Decode = (address, ignoreChecksum, ss58Format) => {
const { decodeAddress } = require('@polkadot/util-crypto')
return fallbackIfFails(decodeAddress, [
address,
ignoreChecksum,
ss58Format,
])
}
/**
* @name strToHex
* @summary converts string to hexadecimal string
*
* @param {String} str
*
* @returns {String}
*/
export const strToHex = str => {
const { stringToHex } = require('@polkadot/util')
return stringToHex(`${str}`)
}
/**
* @name strToU8a
* @summary converts any input Uint8Array
*
* @param {*} value any non-string value will be stringified.
* Objects and Arrays will be stringified using `JSON.stringify(value)`.
* Any Map or Set will be converted to Array first using `Array.from(value)`.
*/
export const strToU8a = value => {
if (isUint8Arr(value)) return value
const { stringToU8a } = require('@polkadot/util')
const str = isArrLike(value)
? JSON.stringify(Array.from(value))
: isObj(value)
? JSON.stringify(value)
: `${value}`
return stringToU8a(str)
}
/**
* @name u8aToStr
*
* @param {Uint8Array} value
*
* @returns {String}
*/
export const u8aToStr = value => {
const { u8aToString } = require('@polkadot/util')
return u8aToString(value)
}
export default {
addressToStr,
bytesToHex,
csvToArr,
csvToMap,
decodeUTF8,
encodeUTF8,
hexToBytes,
ss58Decode,
ss58Encode,
strToU8a,
u8aToStr,
}