templateUtils.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { UrlWithStringQuery, parse as uriParse } from 'url'
  2. import { isString } from '@vue/shared'
  3. export function isRelativeUrl(url: string): boolean {
  4. const firstChar = url.charAt(0)
  5. return firstChar === '.' || firstChar === '~' || firstChar === '@'
  6. }
  7. const externalRE = /^(https?:)?\/\//
  8. export function isExternalUrl(url: string): boolean {
  9. return externalRE.test(url)
  10. }
  11. const dataUrlRE = /^\s*data:/i
  12. export function isDataUrl(url: string): boolean {
  13. return dataUrlRE.test(url)
  14. }
  15. /**
  16. * Parses string url into URL object.
  17. */
  18. export function parseUrl(url: string): UrlWithStringQuery {
  19. const firstChar = url.charAt(0)
  20. if (firstChar === '~') {
  21. const secondChar = url.charAt(1)
  22. url = url.slice(secondChar === '/' ? 2 : 1)
  23. }
  24. return parseUriParts(url)
  25. }
  26. /**
  27. * vuejs/component-compiler-utils#22 Support uri fragment in transformed require
  28. * @param urlString an url as a string
  29. */
  30. function parseUriParts(urlString: string): UrlWithStringQuery {
  31. // A TypeError is thrown if urlString is not a string
  32. // @see https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost
  33. return uriParse(isString(urlString) ? urlString : '', false, true)
  34. }