Skip to content

Commit c2e525b

Browse files
committed
feat: add transformAssetUrls
closes #237
1 parent 183f9dc commit c2e525b

File tree

5 files changed

+70
-2
lines changed

5 files changed

+70
-2
lines changed

packages/shared/src/index.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,41 @@ export function isObject (value: any): value is object {
2828
export function includes (arr: any[], val: any) {
2929
return arr.includes(val)
3030
}
31+
32+
export function toKebabCase (str = '') {
33+
return str
34+
.replace(/[^a-z]/gi, '-')
35+
.replace(/\B([A-Z])/g, '-$1')
36+
.toLowerCase()
37+
}
38+
39+
const defaultTags = {
40+
video: ['src', 'poster'],
41+
source: ['src'],
42+
img: ['src'],
43+
image: ['xlink:href', 'href'],
44+
use: ['xlink:href', 'href'],
45+
}
46+
export const transformAssetUrls = {
47+
VAppBar: ['image'],
48+
VAvatar: ['image'],
49+
VBanner: ['avatar'],
50+
VCard: ['image'],
51+
VCardItem: ['prependAvatar', 'appendAvatar'],
52+
VChip: ['prependAvatar', 'appendAvatar'],
53+
VImg: ['src', 'lazySrc', 'srcset'],
54+
VListItem: ['prependAvatar', 'appendAvatar'],
55+
VNavigationDrawer: ['image'],
56+
VParallax: ['src', 'lazySrc', 'srcset'],
57+
VToolbar: ['image'],
58+
} as Record<string, string[]>
59+
60+
for (const [tag, attrs] of Object.entries(transformAssetUrls)) {
61+
attrs.forEach(attr => {
62+
if (/[A-Z]/.test(attr)) {
63+
attrs.push(toKebabCase(attr))
64+
}
65+
})
66+
transformAssetUrls[toKebabCase(tag)] = attrs
67+
}
68+
Object.assign(transformAssetUrls, defaultTags)

packages/vite-plugin/README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,21 @@ plugins: [
100100
vuetify({ styles: 'sass' }),
101101
]
102102
```
103+
104+
## Image loading
105+
106+
https://github.com/vitejs/vite/tree/main/packages/plugin-vue#asset-url-handling
107+
108+
```js
109+
// vite.config.js
110+
import vuetify, { transformAssetUrls } from 'vite-plugin-vuetify'
111+
112+
export default {
113+
plugins: [
114+
vue({
115+
template: { transformAssetUrls }
116+
}),
117+
vuetify(),
118+
],
119+
}
120+
```

packages/vite-plugin/src/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Plugin } from 'vite'
2-
import { Options, isObject, includes } from '@vuetify/loader-shared'
2+
import { Options, isObject, includes, transformAssetUrls } from '@vuetify/loader-shared'
33

44
import { importPlugin } from './importPlugin'
55
import { stylesPlugin } from './stylesPlugin'
@@ -25,3 +25,6 @@ function vuetify (_options: Options = {}): Plugin[] {
2525

2626
module.exports = vuetify
2727
export default vuetify
28+
29+
module.exports.transformAssetUrls = transformAssetUrls
30+
export { transformAssetUrls }

packages/webpack-plugin/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export { default as VuetifyLoader } from './scriptLoader'
22
export { VuetifyPlugin } from './plugin'
33
// export { ProgressiveLoaderModule as VuetifyProgressiveModule } from './progressive-loader'
4+
export { transformAssetUrls } from '@vuetify/loader-shared'

packages/webpack-plugin/src/plugin.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { writeFile } from 'fs/promises'
44
import * as path from 'upath'
55
import * as mkdirp from 'mkdirp'
66

7-
import { resolveVuetifyBase, writeStyles, includes, isObject, cacheDir } from '@vuetify/loader-shared'
7+
import { resolveVuetifyBase, writeStyles, includes, isObject, cacheDir, transformAssetUrls } from '@vuetify/loader-shared'
88

99
import type { Compiler, NormalModule, Module } from 'webpack'
1010
import type { Options } from '@vuetify/loader-shared'
@@ -41,6 +41,14 @@ export class VuetifyPlugin {
4141
})
4242
}
4343

44+
const vueLoader = compiler.options.module.rules.find(rule => {
45+
return typeof rule !== 'string' && rule.loader && path.toUnix(rule.loader).endsWith('vue-loader/dist/templateLoader.js')
46+
})
47+
const vueOptions = typeof vueLoader === 'object' && vueLoader?.options
48+
if (vueOptions && typeof vueOptions === 'object') {
49+
vueOptions.transformAssetUrls ??= transformAssetUrls
50+
}
51+
4452
const vuetifyBase = resolveVuetifyBase()
4553

4654
function hookResolve (transform: (file: string) => string | Promise<string>) {

0 commit comments

Comments
 (0)