build.mjs 884 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import * as qs from 'node:querystring';
  2. /**
  3. * @typedef ParsedURL
  4. * @type {import('.').ParsedURL}
  5. */
  6. /**
  7. * @typedef Request
  8. * @property {string} url
  9. * @property {ParsedURL} _parsedUrl
  10. */
  11. /**
  12. * @param {Request} req
  13. * @returns {ParsedURL|void}
  14. */
  15. export function parse(req) {
  16. let raw = req.url;
  17. if (raw == null) return;
  18. let prev = req._parsedUrl;
  19. if (prev && prev.raw === raw) return prev;
  20. let pathname=raw, search='', query, hash;
  21. if (raw.length > 1) {
  22. let idx = raw.indexOf('#', 1);
  23. if (idx !== -1) {
  24. hash = raw.substring(idx);
  25. pathname = raw.substring(0, idx);
  26. }
  27. idx = pathname.indexOf('?', 1);
  28. if (idx !== -1) {
  29. search = pathname.substring(idx);
  30. pathname = pathname.substring(0, idx);
  31. if (search.length > 1) {
  32. query = qs.parse(search.substring(1));
  33. }
  34. }
  35. }
  36. return req._parsedUrl = { pathname, search, query, hash, raw };
  37. }