Spaces:
Sleeping
Sleeping
// 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 | |
} | |