url.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import parser from "yargs-parser"
  2. import { pipe } from "fp-ts/function"
  3. import * as O from "fp-ts/Option"
  4. import { getDefaultRESTRequest } from "~/newstore/RESTSession"
  5. import { stringArrayJoin } from "~/helpers/functional/array"
  6. const defaultRESTReq = getDefaultRESTRequest()
  7. const getProtocolForBaseURL = (baseURL: string) =>
  8. pipe(
  9. // get the base URL
  10. /^([^\s:@]+:[^\s:@]+@)?([^:/\s]+)([:]*)/.exec(baseURL),
  11. O.fromNullable,
  12. O.filter((burl) => burl.length > 1),
  13. O.map((burl) => burl[2]),
  14. // set protocol to http for local URLs
  15. O.map((burl) =>
  16. burl === "localhost" || burl === "127.0.0.1"
  17. ? "http://" + baseURL
  18. : "https://" + baseURL
  19. )
  20. )
  21. /**
  22. * Processes URL string and returns the URL object
  23. * @param parsedArguments Parsed Arguments object
  24. * @returns URL object
  25. */
  26. export function parseURL(parsedArguments: parser.Arguments) {
  27. return pipe(
  28. // contains raw url string
  29. parsedArguments._[1],
  30. O.fromNullable,
  31. // preprocess url string
  32. O.map((u) => u.toString().replace(/["']/g, "").trim()),
  33. O.chain((u) =>
  34. pipe(
  35. // check if protocol is available
  36. /^[^:\s]+(?=:\/\/)/.exec(u),
  37. O.fromNullable,
  38. O.map((_) => u),
  39. O.alt(() => getProtocolForBaseURL(u))
  40. )
  41. ),
  42. O.map((u) => new URL(u)),
  43. // no url found
  44. O.getOrElse(() => new URL(defaultRESTReq.endpoint))
  45. )
  46. }
  47. /**
  48. * Joins dangling params to origin
  49. * @param urlObject URL object containing origin and pathname
  50. * @param danglingParams Keys of params with empty values
  51. * @returns origin string concatenated with dangling paramas
  52. */
  53. export function concatParams(urlObject: URL, danglingParams: string[]) {
  54. return pipe(
  55. O.Do,
  56. O.bind("originString", () =>
  57. pipe(
  58. urlObject.origin,
  59. O.fromPredicate((h) => h !== "")
  60. )
  61. ),
  62. O.map(({ originString }) =>
  63. pipe(
  64. danglingParams,
  65. O.fromPredicate((dp) => dp.length > 0),
  66. O.map(stringArrayJoin("&")),
  67. O.map((h) => originString + (urlObject.pathname || "") + "?" + h),
  68. O.getOrElse(() => originString + (urlObject.pathname || ""))
  69. )
  70. ),
  71. O.getOrElse(() => defaultRESTReq.endpoint)
  72. )
  73. }