diff --git a/dist/format.js b/dist/format.js new file mode 100644 index 0000000..68665cd --- /dev/null +++ b/dist/format.js @@ -0,0 +1,60 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _util = require('./util'); + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var xxx = function xxx(key) { + return function (value) { + return key + '=' + (value && !(0, _util.isToken)(value) ? (0, _util.quote)(value) : value); + }; +}; + +var build = function build(params) { + return params.reduce(function (prev, _ref) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + values = _ref2[1]; + + var transform = xxx(key); + if (!(0, _util.isToken)(key)) { + throw new TypeError(); + } + if (Array.isArray(values)) { + return [].concat(_toConsumableArray(prev), _toConsumableArray(values.map(transform))); + } + return [].concat(_toConsumableArray(prev), [transform(values)]); + }, []); +}; + +var challenge = function challenge(params, options) { + if (Array.isArray(params)) { + return build(params); + } else if ((typeof params === 'undefined' ? 'undefined' : _typeof(params)) === 'object') { + return challenge(Object.keys(params).map(function (key) { + return [key, params[key]]; + }), options); + } + throw new TypeError(); +}; + +exports.default = function (scheme, token, params) { + var obj = typeof scheme === 'string' ? { scheme: scheme, token: token, params: params } : scheme; + + if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object') { + throw new TypeError(); + } else if (!(0, _util.isScheme)(obj.scheme)) { + throw new TypeError('Invalid scheme.'); + } + + return [obj.scheme].concat(_toConsumableArray(typeof obj.token !== 'undefined' ? [obj.token] : []), _toConsumableArray(typeof obj.params !== 'undefined' ? challenge(obj.params) : [])).join(' '); +}; +//# sourceMappingURL=format.js.map \ No newline at end of file diff --git a/dist/format.js.map b/dist/format.js.map new file mode 100644 index 0000000..9684148 --- /dev/null +++ b/dist/format.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/format.js"],"names":["xxx","key","value","build","params","reduce","prev","values","transform","TypeError","Array","isArray","map","challenge","options","Object","keys","scheme","token","obj","join"],"mappings":";;;;;;;;;;AAAA;;;;AAEA,IAAMA,MAAM,SAANA,GAAM,CAACC,GAAD;AAAA,SAAS,UAACC,KAAD;AAAA,WAChBD,GADgB,UACTC,SAAS,CAAC,mBAAQA,KAAR,CAAV,GAA2B,iBAAMA,KAAN,CAA3B,GAA0CA,KADjC;AAAA,GAAT;AAAA,CAAZ;;AAGA,IAAMC,QAAQ,SAARA,KAAQ,CAACC,MAAD,EAAY;AACxB,SAAOA,OAAOC,MAAP,CAAc,UAACC,IAAD,QAAyB;AAAA;AAAA,QAAjBL,GAAiB;AAAA,QAAZM,MAAY;;AAC5C,QAAMC,YAAYR,IAAIC,GAAJ,CAAlB;AACA,QAAI,CAAC,mBAAQA,GAAR,CAAL,EAAmB;AACjB,YAAM,IAAIQ,SAAJ,EAAN;AACD;AACD,QAAIC,MAAMC,OAAN,CAAcJ,MAAd,CAAJ,EAA2B;AACzB,0CAAWD,IAAX,sBAAoBC,OAAOK,GAAP,CAAWJ,SAAX,CAApB;AACD;AACD,wCAAWF,IAAX,IAAiBE,UAAUD,MAAV,CAAjB;AACD,GATM,EASJ,EATI,CAAP;AAUD,CAXD;;AAaA,IAAMM,YAAY,SAAZA,SAAY,CAACT,MAAD,EAASU,OAAT,EAAqB;AACrC,MAAIJ,MAAMC,OAAN,CAAcP,MAAd,CAAJ,EAA2B;AACzB,WAAOD,MAAMC,MAAN,CAAP;AACD,GAFD,MAEO,IAAI,QAAOA,MAAP,yCAAOA,MAAP,OAAkB,QAAtB,EAAgC;AACrC,WAAOS,UACLE,OAAOC,IAAP,CAAYZ,MAAZ,EAAoBQ,GAApB,CAAwB,UAACX,GAAD;AAAA,aAAS,CAACA,GAAD,EAAMG,OAAOH,GAAP,CAAN,CAAT;AAAA,KAAxB,CADK,EAELa,OAFK,CAAP;AAID;AACD,QAAM,IAAIL,SAAJ,EAAN;AACD,CAVD;;kBAYe,UAACQ,MAAD,EAASC,KAAT,EAAgBd,MAAhB,EAA2B;AACxC,MAAMe,MAAM,OAAOF,MAAP,KAAkB,QAAlB,GAA6B,EAACA,cAAD,EAASC,YAAT,EAAgBd,cAAhB,EAA7B,GAAuDa,MAAnE;;AAEA,MAAI,QAAOE,GAAP,yCAAOA,GAAP,OAAe,QAAnB,EAA6B;AAC3B,UAAM,IAAIV,SAAJ,EAAN;AACD,GAFD,MAEO,IAAI,CAAC,oBAASU,IAAIF,MAAb,CAAL,EAA2B;AAChC,UAAM,IAAIR,SAAJ,CAAc,iBAAd,CAAN;AACD;;AAED,SAAO,CACLU,IAAIF,MADC,4BAED,OAAOE,IAAID,KAAX,KAAqB,WAArB,GAAmC,CAACC,IAAID,KAAL,CAAnC,GAAiD,EAFhD,sBAGD,OAAOC,IAAIf,MAAX,KAAsB,WAAtB,GAAoCS,UAAUM,IAAIf,MAAd,CAApC,GAA4D,EAH3D,GAILgB,IAJK,CAIA,GAJA,CAAP;AAKD,C","file":"format.js","sourcesContent":["import {quote, isToken, isScheme} from './util';\n\nconst xxx = (key) => (value) =>\n `${key}=${value && !isToken(value) ? quote(value) : value}`;\n\nconst build = (params) => {\n return params.reduce((prev, [key, values]) => {\n const transform = xxx(key);\n if (!isToken(key)) {\n throw new TypeError();\n }\n if (Array.isArray(values)) {\n return [...prev, ...values.map(transform)];\n }\n return [...prev, transform(values)];\n }, []);\n};\n\nconst challenge = (params, options) => {\n if (Array.isArray(params)) {\n return build(params);\n } else if (typeof params === 'object') {\n return challenge(\n Object.keys(params).map((key) => [key, params[key]]),\n options\n );\n }\n throw new TypeError();\n};\n\nexport default (scheme, token, params) => {\n const obj = typeof scheme === 'string' ? {scheme, token, params} : scheme;\n\n if (typeof obj !== 'object') {\n throw new TypeError();\n } else if (!isScheme(obj.scheme)) {\n throw new TypeError('Invalid scheme.');\n }\n\n return [\n obj.scheme,\n ...(typeof obj.token !== 'undefined' ? [obj.token] : []),\n ...(typeof obj.params !== 'undefined' ? challenge(obj.params) : []),\n ].join(' ');\n};\n"]} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..869e6a1 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,25 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.parse = exports.format = exports.InvalidHeaderError = undefined; + +var _invalidHeaderError = require('./invalid-header-error'); + +var _invalidHeaderError2 = _interopRequireDefault(_invalidHeaderError); + +var _format = require('./format'); + +var _format2 = _interopRequireDefault(_format); + +var _parse = require('./parse'); + +var _parse2 = _interopRequireDefault(_parse); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.InvalidHeaderError = _invalidHeaderError2.default; +exports.format = _format2.default; +exports.parse = _parse2.default; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 0000000..a02ee38 --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/index.js"],"names":["InvalidHeaderError","format","parse"],"mappings":";;;;;;;AAAA;;;;AACA;;;;AACA;;;;;;QAEQA,kB;QAAoBC,M;QAAQC,K","file":"index.js","sourcesContent":["import InvalidHeaderError from './invalid-header-error';\nimport format from './format';\nimport parse from './parse';\n\nexport {InvalidHeaderError, format, parse};\n"]} \ No newline at end of file diff --git a/dist/invalid-header-error.js b/dist/invalid-header-error.js new file mode 100644 index 0000000..b5da575 --- /dev/null +++ b/dist/invalid-header-error.js @@ -0,0 +1,16 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var InvalidHeaderError = function InvalidHeaderError(message) { + this.name = 'InvalidHeaderError'; + this.message = message; + this.stack = new Error().stack; +}; + +InvalidHeaderError.prototype = Object.create(TypeError.prototype); +InvalidHeaderError.prototype.constructor = InvalidHeaderError; + +exports.default = InvalidHeaderError; +//# sourceMappingURL=invalid-header-error.js.map \ No newline at end of file diff --git a/dist/invalid-header-error.js.map b/dist/invalid-header-error.js.map new file mode 100644 index 0000000..89d27f2 --- /dev/null +++ b/dist/invalid-header-error.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/invalid-header-error.js"],"names":["InvalidHeaderError","message","name","stack","Error","prototype","Object","create","TypeError","constructor"],"mappings":";;;;;AAAA,IAAMA,qBAAqB,SAASA,kBAAT,CAA4BC,OAA5B,EAAqC;AAC9D,OAAKC,IAAL,GAAY,oBAAZ;AACA,OAAKD,OAAL,GAAeA,OAAf;AACA,OAAKE,KAAL,GAAc,IAAIC,KAAJ,EAAD,CAAcD,KAA3B;AACD,CAJD;;AAMAH,mBAAmBK,SAAnB,GAA+BC,OAAOC,MAAP,CAAcC,UAAUH,SAAxB,CAA/B;AACAL,mBAAmBK,SAAnB,CAA6BI,WAA7B,GAA2CT,kBAA3C;;kBAEeA,kB","file":"invalid-header-error.js","sourcesContent":["const InvalidHeaderError = function InvalidHeaderError(message) {\n this.name = 'InvalidHeaderError';\n this.message = message;\n this.stack = (new Error()).stack;\n};\n\nInvalidHeaderError.prototype = Object.create(TypeError.prototype);\nInvalidHeaderError.prototype.constructor = InvalidHeaderError;\n\nexport default InvalidHeaderError;\n"]} \ No newline at end of file diff --git a/dist/parse.js b/dist/parse.js new file mode 100644 index 0000000..d7c621f --- /dev/null +++ b/dist/parse.js @@ -0,0 +1,61 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _invalidHeaderError = require('./invalid-header-error'); + +var _invalidHeaderError2 = _interopRequireDefault(_invalidHeaderError); + +var _util = require('./util'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// lol dis +var body = /((?:[a-zA-Z0-9._~+\/-]+=*(?:\s+|$))|[^\u0000-\u001F\u007F()<>@,;:\\"/?={}\[\]\u0020\u0009]+)(?:=([^\\"=\s,]+|"(?:[^"\\]|\\.)*"))?/g; // eslint-disable-line + +var normalize = function normalize(prev, _cur) { + // Fixup quoted strings and tokens with spaces around them + var cur = _cur.charAt(0) === '"' ? (0, _util.unquote)(_cur) : _cur.trim(); + + // Marshal + if (Array.isArray(prev)) { + return prev.concat(cur); + } else if (prev) { + return [prev, cur]; + } + return cur; +}; + +var parseProperties = function parseProperties(scheme, string) { + var res = null; + var token = null; + var params = {}; + + while ((res = body.exec(string)) !== null) { + if (res[2]) { + params[res[1]] = normalize(params[res[1]], res[2]); + } else { + token = normalize(token, res[1]); + } + } + + return { scheme: scheme, params: params, token: token }; +}; + +exports.default = function (str) { + if (typeof str !== 'string') { + throw new _invalidHeaderError2.default('Header value must be a string.'); + } + + var start = str.indexOf(' '); + var scheme = str.substr(0, start); + + if (!(0, _util.isScheme)(scheme)) { + throw new _invalidHeaderError2.default('Invalid scheme ' + scheme); + } + + return parseProperties(scheme, str.substr(start)); +}; +//# sourceMappingURL=parse.js.map \ No newline at end of file diff --git a/dist/parse.js.map b/dist/parse.js.map new file mode 100644 index 0000000..ca9ab24 --- /dev/null +++ b/dist/parse.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/parse.js"],"names":["body","normalize","prev","_cur","cur","charAt","trim","Array","isArray","concat","parseProperties","scheme","string","res","token","params","exec","str","start","indexOf","substr"],"mappings":";;;;;;AAAA;;;;AACA;;;;AAEA;AACA,IAAMA,OAAO,oIAAb,C,CAAmJ;;AAEnJ,IAAMC,YAAY,SAAZA,SAAY,CAACC,IAAD,EAAOC,IAAP,EAAgB;AAChC;AACA,MAAMC,MAAMD,KAAKE,MAAL,CAAY,CAAZ,MAAmB,GAAnB,GAAyB,mBAAQF,IAAR,CAAzB,GAAyCA,KAAKG,IAAL,EAArD;;AAEA;AACA,MAAIC,MAAMC,OAAN,CAAcN,IAAd,CAAJ,EAAyB;AACvB,WAAOA,KAAKO,MAAL,CAAYL,GAAZ,CAAP;AACD,GAFD,MAEO,IAAIF,IAAJ,EAAU;AACf,WAAO,CAACA,IAAD,EAAOE,GAAP,CAAP;AACD;AACD,SAAOA,GAAP;AACD,CAXD;;AAaA,IAAMM,kBAAkB,SAAlBA,eAAkB,CAACC,MAAD,EAASC,MAAT,EAAoB;AAC1C,MAAIC,MAAM,IAAV;AACA,MAAIC,QAAQ,IAAZ;AACA,MAAMC,SAAS,EAAf;;AAEA,SAAO,CAACF,MAAMb,KAAKgB,IAAL,CAAUJ,MAAV,CAAP,MAA8B,IAArC,EAA2C;AACzC,QAAIC,IAAI,CAAJ,CAAJ,EAAY;AACVE,aAAOF,IAAI,CAAJ,CAAP,IAAiBZ,UAAUc,OAAOF,IAAI,CAAJ,CAAP,CAAV,EAA0BA,IAAI,CAAJ,CAA1B,CAAjB;AACD,KAFD,MAEO;AACLC,cAAQb,UAAUa,KAAV,EAAiBD,IAAI,CAAJ,CAAjB,CAAR;AACD;AACF;;AAED,SAAO,EAACF,cAAD,EAASI,cAAT,EAAiBD,YAAjB,EAAP;AACD,CAdD;;kBAgBe,UAACG,GAAD,EAAS;AACtB,MAAI,OAAOA,GAAP,KAAe,QAAnB,EAA6B;AAC3B,UAAM,iCAAuB,gCAAvB,CAAN;AACD;;AAED,MAAMC,QAAQD,IAAIE,OAAJ,CAAY,GAAZ,CAAd;AACA,MAAMR,SAASM,IAAIG,MAAJ,CAAW,CAAX,EAAcF,KAAd,CAAf;;AAEA,MAAI,CAAC,oBAASP,MAAT,CAAL,EAAuB;AACrB,UAAM,qDAAyCA,MAAzC,CAAN;AACD;;AAED,SAAOD,gBAAgBC,MAAhB,EAAwBM,IAAIG,MAAJ,CAAWF,KAAX,CAAxB,CAAP;AACD,C","file":"parse.js","sourcesContent":["import InvalidHeaderError from './invalid-header-error';\nimport {isScheme, unquote} from './util';\n\n// lol dis\nconst body = /((?:[a-zA-Z0-9._~+\\/-]+=*(?:\\s+|$))|[^\\u0000-\\u001F\\u007F()<>@,;:\\\\\"/?={}\\[\\]\\u0020\\u0009]+)(?:=([^\\\\\"=\\s,]+|\"(?:[^\"\\\\]|\\\\.)*\"))?/g; // eslint-disable-line\n\nconst normalize = (prev, _cur) => {\n // Fixup quoted strings and tokens with spaces around them\n const cur = _cur.charAt(0) === '\"' ? unquote(_cur) : _cur.trim();\n\n // Marshal\n if (Array.isArray(prev)) {\n return prev.concat(cur);\n } else if (prev) {\n return [prev, cur];\n }\n return cur;\n};\n\nconst parseProperties = (scheme, string) => {\n let res = null;\n let token = null;\n const params = { };\n\n while ((res = body.exec(string)) !== null) {\n if (res[2]) {\n params[res[1]] = normalize(params[res[1]], res[2]);\n } else {\n token = normalize(token, res[1]);\n }\n }\n\n return {scheme, params, token};\n};\n\nexport default (str) => {\n if (typeof str !== 'string') {\n throw new InvalidHeaderError('Header value must be a string.');\n }\n\n const start = str.indexOf(' ');\n const scheme = str.substr(0, start);\n\n if (!isScheme(scheme)) {\n throw new InvalidHeaderError(`Invalid scheme ${scheme}`);\n }\n\n return parseProperties(scheme, str.substr(start));\n};\n"]} \ No newline at end of file diff --git a/dist/util.js b/dist/util.js new file mode 100644 index 0000000..add617c --- /dev/null +++ b/dist/util.js @@ -0,0 +1,18 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var token = /^[^\u0000-\u001F\u007F()<>@,;:\\"/?={}\[\]\u0020\u0009]+$/; + +var isToken = exports.isToken = function isToken(str) { + return typeof str === 'string' && token.test(str); +}; +var isScheme = exports.isScheme = isToken; +var quote = exports.quote = function quote(str) { + return '"' + str.replace(/"/g, '\\"') + '"'; +}; +var unquote = exports.unquote = function unquote(str) { + return str.substr(1, str.length - 2).replace(/\\"/g, '"'); +}; +//# sourceMappingURL=util.js.map \ No newline at end of file diff --git a/dist/util.js.map b/dist/util.js.map new file mode 100644 index 0000000..dc00e04 --- /dev/null +++ b/dist/util.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/util.js"],"names":["token","isToken","str","test","isScheme","quote","replace","unquote","substr","length"],"mappings":";;;;;AAAA,IAAMA,QAAQ,2DAAd;;AAEO,IAAMC,4BAAU,SAAVA,OAAU,CAACC,GAAD;AAAA,SAAS,OAAOA,GAAP,KAAe,QAAf,IAA2BF,MAAMG,IAAN,CAAWD,GAAX,CAApC;AAAA,CAAhB;AACA,IAAME,8BAAWH,OAAjB;AACA,IAAMI,wBAAQ,SAARA,KAAQ,CAACH,GAAD;AAAA,eAAaA,IAAII,OAAJ,CAAY,IAAZ,EAAkB,KAAlB,CAAb;AAAA,CAAd;AACA,IAAMC,4BAAU,SAAVA,OAAU,CAACL,GAAD;AAAA,SAASA,IAAIM,MAAJ,CAAW,CAAX,EAAcN,IAAIO,MAAJ,GAAa,CAA3B,EAC7BH,OAD6B,CACrB,MADqB,EACb,GADa,CAAT;AAAA,CAAhB","file":"util.js","sourcesContent":["const token = /^[^\\u0000-\\u001F\\u007F()<>@,;:\\\\\"/?={}\\[\\]\\u0020\\u0009]+$/;\n\nexport const isToken = (str) => typeof str === 'string' && token.test(str);\nexport const isScheme = isToken;\nexport const quote = (str) => `\"${str.replace(/\"/g, '\\\\\"')}\"`;\nexport const unquote = (str) => str.substr(1, str.length - 2)\n .replace(/\\\\\"/g, '\"');\n"]} \ No newline at end of file