Skip to content

Commit 8175b77

Browse files
committed
feat: enum of the sprite and its contents
1 parent fc9df27 commit 8175b77

File tree

5 files changed

+86
-8
lines changed

5 files changed

+86
-8
lines changed

docs/content/1.index.md

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,22 @@ export default defineNuxtConfig({
6262

6363
::code-group
6464

65-
```html [Usage]
65+
```vue [Usage]
66+
<script setup>
67+
import { Love } from '#sprite'
68+
</script>
69+
6670
<template>
6771
<div>
6872
<h2>Default sprite(top level icons)</h2>
6973
<SvgIcon name="nuxt" />
7074
7175
<h2>Named Sprite</h2>
7276
<SvgIcon name="love/love" />
73-
<SvgIcon name="love/bee-mine" />
77+
78+
<h2>Enum Sprite</h2>
79+
<SvgIcon :name="Love.HugsAndKisses" />
80+
<SvgIcon :name="Love.BeeMine" />
7481
</div>
7582
</template>
7683
```
@@ -83,6 +90,10 @@ export default defineNuxtConfig({
8390
## Named Sprite
8491

8592
:SvgIcon{name="love/love"}
93+
94+
## Enum Sprite
95+
96+
:SvgIcon{name="love/hugs-and-kisses"}
8697
:SvgIcon{name="love/bee-mine"}
8798
::
8899
::
@@ -125,4 +136,4 @@ Or locally:
125136

126137
[MIT License](https://github.com/nuxt-community/svg-sprite-module/blob/master/LICENSE)
127138

128-
Copyright (c) Nuxt Community
139+
Copyright (c) Nuxt Community

playground/pages/index.vue

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
<svg-icon name="dreams/Beautiful_Little_Girl_7881" title="Beautiful Little Girl" width="150px" height="150px" />
1010
</div>
1111
<div>
12-
<svg-icon name="love/Bee Mine" title="Bee Mine" width="150px" height="150px" />
13-
<svg-icon name="love/Hugs And Kisses" title="Hugs And Kisses" width="150px" height="150px" />
14-
<svg-icon name="love/Love" title="Love" width="150px" height="150px" />
12+
<svg-icon :name="Love.Love" title="Bee Mine" width="150px" height="150px" />
13+
<svg-icon :name="Love.HugsAndKisses" title="Hugs And Kisses" width="150px" height="150px" />
14+
<svg-icon :name="Love.Love" title="Love" width="150px" height="150px" />
1515
</div>
1616
<div class="copyright">
1717
photos by <a href="https://lovesvg.com" rel="noopener" target="_blank">lovesvg</a>
@@ -20,6 +20,9 @@
2020
</template>
2121

2222
<script setup lang="ts">
23+
24+
import { Love } from '#sprite'
25+
2326
const aboutNuxt = 'Nuxt.js presets all the configuration needed to make your development of a Vue.js application enjoyable.'
2427
</script>
2528

src/module.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ import {
99
useLogger,
1010
addLayout,
1111
addServerHandler,
12-
updateTemplates
12+
updateTemplates,
13+
addTypeTemplate
1314
} from '@nuxt/kit'
1415
import type { Config as SVGOConfig } from 'svgo'
1516
import inlineDefs from './svgo-plugins/inlineDefs'
16-
import { iconsTemplate, spritesTemplate } from './template'
17+
import { iconCollectionDefinitionsTemplate, iconCollectionTemplate, iconsTemplate, spritesTemplate } from './template'
1718
import { createSpritesManager, useSvgFile } from './utils'
1819

1920
export interface ModuleOptions {
@@ -84,6 +85,7 @@ export default defineNuxtModule<ModuleOptions>({
8485
}
8586

8687
const { sprites, addSvg, removeSvg, generateSprite } = createSpritesManager(options.optimizeOptions)
88+
8789
nuxt.options.alias['#svg-sprite'] = addTemplate({
8890
...spritesTemplate,
8991
write: true,
@@ -94,6 +96,21 @@ export default defineNuxtModule<ModuleOptions>({
9496
}
9597
}).dst
9698

99+
addTypeTemplate({
100+
...iconCollectionDefinitionsTemplate,
101+
write: true,
102+
options: {
103+
sprites
104+
}
105+
})
106+
nuxt.options.alias['#sprite'] = addTemplate({
107+
...iconCollectionTemplate,
108+
write: true,
109+
options: {
110+
sprites
111+
}
112+
}).dst
113+
97114
// Register icons page
98115
if (options.iconsPath) {
99116
// Add layout

src/template.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { pascalCase } from './utils'
12

23
export const spritesTemplate = {
34
filename: 'svg-sprite.mjs',
@@ -28,3 +29,36 @@ export const iconsTemplate = {
2829
].join('\n')
2930
}
3031
}
32+
33+
export const iconCollectionTemplate = {
34+
filename: 'svg-sprite-icon-collection.mjs',
35+
getContents ({ options }: any) {
36+
const sprites = Object.entries(options.sprites).map(([name, values]) => {
37+
const icons = (values as any[]).map((icon) => {
38+
return `\t${pascalCase(icon.name)}: '${name}/${icon.name}',`
39+
})
40+
return [`export const ${pascalCase(name)} = {`, ...icons, '};\n']
41+
})
42+
return [
43+
'// Generated by @nuxtjs/svg-sprite',
44+
...sprites.flat(2)
45+
].join('\n')
46+
}
47+
}
48+
export const iconCollectionDefinitionsTemplate = {
49+
filename: 'types/svg-sprite-icon-collection.d.ts',
50+
getContents ({ options }: any) {
51+
const sprites = Object.entries(options.sprites).map(([name, values]) => {
52+
const icons = (values as any[]).map((icon) => {
53+
return `\t\treadonly ${pascalCase(icon.name)}: '${name}/${icon.name}',`
54+
})
55+
return [`\texport declare const ${pascalCase(name)}: {`, ...icons, '\t};\n']
56+
})
57+
return [
58+
'// Generated by @nuxtjs/svg-sprite',
59+
'declare module \'#sprite\' {',
60+
...sprites.flat(2),
61+
'}'
62+
].join('\n')
63+
}
64+
}

src/utils.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,16 @@ async function optimizeSVG (svg: SVG, optimizeOptions: Config = {}) {
103103
content: $data.data
104104
}
105105
}
106+
107+
export function pascalCase (string: string): string {
108+
return `${string}`
109+
.toLowerCase()
110+
.replace(/[-_]+/g, ' ')
111+
.replace(/[^\w\s]/g, '')
112+
.replace(
113+
/\s+(.)(\w*)/g,
114+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
115+
($1, $2, $3) => `${$2.toUpperCase() + $3}`
116+
)
117+
.replace(/\w/, s => s.toUpperCase())
118+
}

0 commit comments

Comments
 (0)