url.ts 1.8 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1
import path from 'path'
fxy060608's avatar
fxy060608 已提交
2
import { EXTNAME_JS_RE, EXTNAME_VUE } from '../../constants'
fxy060608's avatar
fxy060608 已提交
3 4 5 6 7 8 9 10 11 12 13 14

export interface VueQuery {
  vue?: boolean
  src?: boolean
  type?: 'script' | 'template' | 'style' | 'custom'
  index?: number
  lang?: string
  raw?: boolean
}

export function parseVueRequest(id: string) {
  const [filename, rawQuery] = id.split(`?`, 2)
15
  const query = Object.fromEntries(new URLSearchParams(rawQuery)) as VueQuery
fxy060608's avatar
fxy060608 已提交
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
  if (query.vue != null) {
    query.vue = true
  }
  if (query.src != null) {
    query.src = true
  }
  if (query.index != null) {
    query.index = Number(query.index)
  }
  if (query.raw != null) {
    query.raw = true
  }
  return {
    filename,
    query,
  }
}
fxy060608's avatar
fxy060608 已提交
33

fxy060608's avatar
fxy060608 已提交
34
const importQueryRE = /(\?|&)import=?(?:&|$)/
fxy060608's avatar
fxy060608 已提交
35 36
export const isImportRequest = (url: string) => importQueryRE.test(url)

fxy060608's avatar
fxy060608 已提交
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
/**
 * Prefix for resolved fs paths, since windows paths may not be valid as URLs.
 */
export const FS_PREFIX = `/@fs/`

/**
 * Prefix for resolved Ids that are not valid browser import specifiers
 */
export const VALID_ID_PREFIX = `/@id/`
export const CLIENT_PUBLIC_PATH = `/@vite/client`
export const ENV_PUBLIC_PATH = `/@vite/env`
const internalPrefixes = [
  FS_PREFIX,
  VALID_ID_PREFIX,
  CLIENT_PUBLIC_PATH,
  ENV_PUBLIC_PATH,
]
const InternalPrefixRE = new RegExp(`^(?:${internalPrefixes.join('|')})`)
export const isInternalRequest = (url: string): boolean =>
  InternalPrefixRE.test(url)

fxy060608's avatar
fxy060608 已提交
58 59 60 61 62
export const queryRE = /\?.*$/
export const hashRE = /#.*$/

export const cleanUrl = (url: string) =>
  url.replace(hashRE, '').replace(queryRE, '')
fxy060608's avatar
fxy060608 已提交
63 64

export function isJsFile(id: string) {
fxy060608's avatar
fxy060608 已提交
65 66
  const { filename, query } = parseVueRequest(id)
  const isJs = EXTNAME_JS_RE.test(filename)
fxy060608's avatar
fxy060608 已提交
67 68 69 70 71 72 73 74 75
  if (isJs) {
    return true
  }
  const isVueJs = EXTNAME_VUE.includes(path.extname(filename)) && !query.vue
  if (isVueJs) {
    return true
  }
  return false
}