headers.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. "use strict";
  2. // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
  3. Object.defineProperty(exports, "__esModule", { value: true });
  4. exports.isEmptyHeaders = exports.buildHeaders = void 0;
  5. const values_1 = require("./utils/values.js");
  6. const brand_privateNullableHeaders = /* @__PURE__ */ Symbol('brand.privateNullableHeaders');
  7. function* iterateHeaders(headers) {
  8. if (!headers)
  9. return;
  10. if (brand_privateNullableHeaders in headers) {
  11. const { values, nulls } = headers;
  12. yield* values.entries();
  13. for (const name of nulls) {
  14. yield [name, null];
  15. }
  16. return;
  17. }
  18. let shouldClear = false;
  19. let iter;
  20. if (headers instanceof Headers) {
  21. iter = headers.entries();
  22. }
  23. else if ((0, values_1.isReadonlyArray)(headers)) {
  24. iter = headers;
  25. }
  26. else {
  27. shouldClear = true;
  28. iter = Object.entries(headers ?? {});
  29. }
  30. for (let row of iter) {
  31. const name = row[0];
  32. if (typeof name !== 'string')
  33. throw new TypeError('expected header name to be a string');
  34. const values = (0, values_1.isReadonlyArray)(row[1]) ? row[1] : [row[1]];
  35. let didClear = false;
  36. for (const value of values) {
  37. if (value === undefined)
  38. continue;
  39. // Objects keys always overwrite older headers, they never append.
  40. // Yield a null to clear the header before adding the new values.
  41. if (shouldClear && !didClear) {
  42. didClear = true;
  43. yield [name, null];
  44. }
  45. yield [name, value];
  46. }
  47. }
  48. }
  49. const buildHeaders = (newHeaders) => {
  50. const targetHeaders = new Headers();
  51. const nullHeaders = new Set();
  52. for (const headers of newHeaders) {
  53. const seenHeaders = new Set();
  54. for (const [name, value] of iterateHeaders(headers)) {
  55. const lowerName = name.toLowerCase();
  56. if (!seenHeaders.has(lowerName)) {
  57. targetHeaders.delete(name);
  58. seenHeaders.add(lowerName);
  59. }
  60. if (value === null) {
  61. targetHeaders.delete(name);
  62. nullHeaders.add(lowerName);
  63. }
  64. else {
  65. targetHeaders.append(name, value);
  66. nullHeaders.delete(lowerName);
  67. }
  68. }
  69. }
  70. return { [brand_privateNullableHeaders]: true, values: targetHeaders, nulls: nullHeaders };
  71. };
  72. exports.buildHeaders = buildHeaders;
  73. const isEmptyHeaders = (headers) => {
  74. for (const _ of iterateHeaders(headers))
  75. return false;
  76. return true;
  77. };
  78. exports.isEmptyHeaders = isEmptyHeaders;
  79. //# sourceMappingURL=headers.js.map