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
- }
|