/**
* Pick out useful axios response fields.
- * @param {*} res
- * @returns
+ * @param {AxiosResponse} res
+ * @returns {Object}
*/
const axiosResponseLogData = (res) => {
const data = pick(res, [
};
+/**
+ * Return a set containing non-shared items between two sets.
+ * @param {Set} a
+ * @param {Set} b
+ * @returns {Set}
+ */
+const setSymmetricDifference = (a, b) => {
+ const d = new Set(a);
+ for (const x of b) {
+ if (d.has(x)) {
+ d.delete(x);
+ } else {
+ d.add(x);
+ }
+ }
+ return d;
+};
+
+
+/**
+ * URL objects have weird names.
+ * @param {String} component
+ * @returns {String}
+ */
+const properURLComponentName = (component) => {
+ // eslint-disable-next-line security/detect-object-injection
+ return {
+ hash: 'fragment',
+ protocol: 'scheme',
+ }[component] || component;
+}
+
+
+/**
+ * Encodes single-level object as form data string.
+ * @param {Object} data
+ */
+const formData = (data) => {
+ const formData = new URLSearchParams();
+ Object.entries(data).forEach(([name, value]) => formData.set(name, value));
+ return formData.toString();
+};
+
+
module.exports = {
fileScope,
axiosResponseLogData,
logTruncate,
pick,
+ setSymmetricDifference,
+ properURLComponentName,
+ formData,
};
\ No newline at end of file