diff --git a/docs/content/1.index.md b/docs/content/1.index.md
index 7e34db16..29dbe271 100644
--- a/docs/content/1.index.md
+++ b/docs/content/1.index.md
@@ -62,7 +62,11 @@ export default defineNuxtConfig({
::code-group
-```html [Usage]
+```vue [Usage]
+
+
Default sprite(top level icons)
@@ -70,7 +74,10 @@ export default defineNuxtConfig({
Named Sprite
-
+
+ Enum Sprite
+
+
```
@@ -83,6 +90,10 @@ export default defineNuxtConfig({
## Named Sprite
:SvgIcon{name="love/love"}
+
+## Enum Sprite
+
+:SvgIcon{name="love/hugs-and-kisses"}
:SvgIcon{name="love/bee-mine"}
::
::
@@ -125,4 +136,4 @@ Or locally:
[MIT License](https://github.com/nuxt-community/svg-sprite-module/blob/master/LICENSE)
-Copyright (c) Nuxt Community
\ No newline at end of file
+Copyright (c) Nuxt Community
diff --git a/playground/pages/index.vue b/playground/pages/index.vue
index 8439bbd3..8bc8bf8a 100644
--- a/playground/pages/index.vue
+++ b/playground/pages/index.vue
@@ -9,9 +9,9 @@
-
-
-
+
+
+
photos by
lovesvg
@@ -20,6 +20,9 @@
diff --git a/src/module.ts b/src/module.ts
index 71be0245..62fe50c2 100644
--- a/src/module.ts
+++ b/src/module.ts
@@ -9,11 +9,12 @@ import {
useLogger,
addLayout,
addServerHandler,
- updateTemplates
+ updateTemplates,
+ addTypeTemplate
} from '@nuxt/kit'
import type { Config as SVGOConfig } from 'svgo'
import inlineDefs from './svgo-plugins/inlineDefs'
-import { iconsTemplate, spritesTemplate } from './template'
+import { iconCollectionDefinitionsTemplate, iconCollectionTemplate, iconsTemplate, spritesTemplate } from './template'
import { createSpritesManager, useSvgFile } from './utils'
export interface ModuleOptions {
@@ -84,6 +85,7 @@ export default defineNuxtModule
({
}
const { sprites, addSvg, removeSvg, generateSprite } = createSpritesManager(options.optimizeOptions)
+
nuxt.options.alias['#svg-sprite'] = addTemplate({
...spritesTemplate,
write: true,
@@ -94,6 +96,21 @@ export default defineNuxtModule({
}
}).dst
+ addTypeTemplate({
+ ...iconCollectionDefinitionsTemplate,
+ write: true,
+ options: {
+ sprites
+ }
+ })
+ nuxt.options.alias['#sprite'] = addTemplate({
+ ...iconCollectionTemplate,
+ write: true,
+ options: {
+ sprites
+ }
+ }).dst
+
// Register icons page
if (options.iconsPath) {
// Add layout
diff --git a/src/template.ts b/src/template.ts
index b299a8a2..bf59a015 100644
--- a/src/template.ts
+++ b/src/template.ts
@@ -1,3 +1,4 @@
+import { pascalCase } from './utils'
export const spritesTemplate = {
filename: 'svg-sprite.mjs',
@@ -28,3 +29,36 @@ export const iconsTemplate = {
].join('\n')
}
}
+
+export const iconCollectionTemplate = {
+ filename: 'svg-sprite-icon-collection.mjs',
+ getContents ({ options }: any) {
+ const sprites = Object.entries(options.sprites).map(([name, values]) => {
+ const icons = (values as any[]).map((icon) => {
+ return `\t${pascalCase(icon.name)}: '${name}/${icon.name}',`
+ })
+ return [`export const ${pascalCase(name)} = {`, ...icons, '};\n']
+ })
+ return [
+ '// Generated by @nuxtjs/svg-sprite',
+ ...sprites.flat(2)
+ ].join('\n')
+ }
+}
+export const iconCollectionDefinitionsTemplate = {
+ filename: 'types/svg-sprite-icon-collection.d.ts',
+ getContents ({ options }: any) {
+ const sprites = Object.entries(options.sprites).map(([name, values]) => {
+ const icons = (values as any[]).map((icon) => {
+ return `\t\treadonly ${pascalCase(icon.name)}: '${name}/${icon.name}',`
+ })
+ return [`\texport declare const ${pascalCase(name)}: {`, ...icons, '\t};\n']
+ })
+ return [
+ '// Generated by @nuxtjs/svg-sprite',
+ 'declare module \'#sprite\' {',
+ ...sprites.flat(2),
+ '}'
+ ].join('\n')
+ }
+}
diff --git a/src/utils.ts b/src/utils.ts
index d22b83b8..120875d3 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -103,3 +103,16 @@ async function optimizeSVG (svg: SVG, optimizeOptions: Config = {}) {
content: $data.data
}
}
+
+export function pascalCase (string: string): string {
+ return `${string}`
+ .toLowerCase()
+ .replace(/[-_]+/g, ' ')
+ .replace(/[^\w\s]/g, '')
+ .replace(
+ /\s+(.)(\w*)/g,
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ ($1, $2, $3) => `${$2.toUpperCase() + $3}`
+ )
+ .replace(/\w/, s => s.toUpperCase())
+}