UNPKG

magento-api-rest-next

Version:

A NodeJS wrapper to work with Magento REST APIs.

156 lines (155 loc) 6.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } const _axios = require("axios"); const _crypto = require("crypto"); const _oAuth = require('oauth-1.0a'); const _url = require('url'); const _transform = require("./lib/transform"); const _parser = require("./lib/parser"); class MagentoRestApi { constructor(options) { options = options || {}; if (!options.url) { throw new Error('URL is required'); } if (!options.consumerKey) { throw new Error('consumerKey is required'); } if (!options.consumerSecret) { throw new Error('consumerSecret is required'); } if (!options.accessToken) { throw new Error('accessToken is required'); } if (!options.tokenSecret) { throw new Error('tokenSecret is required'); } this.clientVersion = require('./package.json').version; this._setDefaults(options); } _setDefaults(opt) { this.url = opt.url; this.consumerKey = opt.consumerKey; this.consumerSecret = opt.consumerSecret; this.accessToken = opt.accessToken; this.tokenSecret = opt.tokenSecret; this.endpointType = opt.type || 'V1'; this.shaVersion = opt.sha || 1; this.timeout = opt.timeout; this.axiosConfig = opt.axiosConfig || {}; this.isSsl = /^https:\/\//i.test(this.url); } _normalizeQueryString(url) { if (!url.includes('?')) { return url; } let query = _url.parse(url, true).query; let params = Object.keys(query); let queryString = ''; for (let i in params) { if (queryString.length) { queryString += '&'; } queryString += encodeURIComponent(params[i]).replace(/%5B/g, '[').replace(/%5D/g, ']'); queryString += '='; queryString += encodeURIComponent(query[params[i]]); } return url.split('?')[0] + '?' + queryString; } _getSHAType() { if (this.shaVersion === 256) { return { "signature": "HMAC-SHA256", "hash": "sha256" }; } else if (this.shaVersion === 1) { return { "signature": "HMAC-SHA1", "hash": "sha1" }; } else { throw new Error('Invalid SHA Version Specified.'); } } _getOAuth(data) { let sha = this._getSHAType(); let oauth = _oAuth({ consumer: { key: this.consumerKey, secret: this.consumerSecret }, signature_method: sha.signature, hash_function(base_string, key) { return _crypto.createHmac(sha.hash, key).update(base_string).digest('base64'); } }); let token = { key: this.accessToken, secret: this.tokenSecret }; return oauth.toHeader(oauth.authorize(data, token)); } _formURL(endpoint) { let accessibleUrl = this.url.slice(-1) === '/' ? this.url : this.url + '/'; if (!this.isSsl) { endpoint = this._normalizeQueryString(endpoint); } return accessibleUrl + 'rest/' + this.endpointType + '/' + endpoint; } _formRequest(method, endpoint, data) { let request_data = { method: method, url: this._formURL(endpoint), body: data }; let options = { method: method, url: request_data.url, timeout: this.timeout, headers: { 'Authorization': this._getOAuth(request_data).Authorization, 'Content-Type': 'application/json', 'Accept': 'application/json' }, data: request_data.body }; if (typeof process !== "undefined" && Object.prototype.toString.call(process) === "[object process]") { options.headers["User-Agent"] = "Magento REST API - JS Client/" + this.clientVersion; } options = _objectSpread(_objectSpread({}, options), this.axiosConfig); return _axios(options); } _searchTranslate(params) { let paramObjKeys = Object.keys(params); let antiTrigger = ["filter_groups", "filterGroups", "sort_orders", "sortOrders", "page_size", "pageSize", "current_page", "currentPage"]; let parserTrigger = paramObjKeys.filter(val => antiTrigger.includes(val)); if (parserTrigger.length === 0) { params = _parser(params); } return _transform(params); } get(endpoint, params, raw = '') { if (params && Object.keys(params).length > 0) { endpoint += '?' + this._searchTranslate(params); } return this._formRequest('GET', `${endpoint}${raw}`); } post(endpoint, data) { return this._formRequest('POST', endpoint, data); } put(endpoint, data) { return this._formRequest('PUT', endpoint, data); } delete(endpoint) { return this._formRequest('DELETE', endpoint); } } exports.default = MagentoRestApi;