| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 | // vue compiler module for transforming `<tag>:<attribute>` to `require`import { urlToRequire, ASTNode, Attr } from './utils'export interface AssetURLOptions {  [name: string]: string | string[]}export interface TransformAssetUrlsOptions {  /**   * If base is provided, instead of transforming relative asset urls into   * imports, they will be directly rewritten to absolute urls.   */  base?: string}const defaultOptions: AssetURLOptions = {  audio: 'src',  video: ['src', 'poster'],  source: 'src',  img: 'src',  image: ['xlink:href', 'href'],  use: ['xlink:href', 'href']}export default (  userOptions?: AssetURLOptions,  transformAssetUrlsOption?: TransformAssetUrlsOptions) => {  const options = userOptions    ? Object.assign({}, defaultOptions, userOptions)    : defaultOptions  return {    postTransformNode: (node: ASTNode) => {      transform(node, options, transformAssetUrlsOption)    }  }}function transform(  node: ASTNode,  options: AssetURLOptions,  transformAssetUrlsOption?: TransformAssetUrlsOptions) {  for (const tag in options) {    if ((tag === '*' || node.tag === tag) && node.attrs) {      const attributes = options[tag]      if (typeof attributes === 'string') {        node.attrs.some(attr =>          rewrite(attr, attributes, transformAssetUrlsOption)        )      } else if (Array.isArray(attributes)) {        attributes.forEach(item =>          node.attrs.some(attr => rewrite(attr, item, transformAssetUrlsOption))        )      }    }  }}function rewrite(  attr: Attr,  name: string,  transformAssetUrlsOption?: TransformAssetUrlsOptions) {  if (attr.name === name) {    const value = attr.value    // only transform static URLs    if (value.charAt(0) === '"' && value.charAt(value.length - 1) === '"') {      attr.value = urlToRequire(value.slice(1, -1), transformAssetUrlsOption)      return true    }  }  return false}
 |