Skip to content

Commit b86b1a3

Browse files
authored
feat: add 'collapseSamePrefixes' option to prevent duplication inside namespaced component name (unplugin#409)
Co-authored-by: DrJume <DrJume@users.noreply.github.com>
1 parent e8520dc commit b86b1a3

File tree

5 files changed

+114
-3
lines changed

5 files changed

+114
-3
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
export default {
3+
name: 'CollapseFolderAndComponentPrefixes',
4+
}
5+
</script>
6+
7+
<template>
8+
<h3>CollapseFolderAndComponentPrefixes Component: <code>collapse/collapseFolderAnd/CollapseFolderAndComponentPrefixes.vue</code></h3>
9+
</template>

src/core/utils.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ export function stringifyComponentImport({ as: name, from: path, name: importNam
111111
}
112112

113113
export function getNameFromFilePath(filePath: string, options: ResolvedOptions): string {
114-
const { resolvedDirs, directoryAsNamespace, globalNamespaces } = options
114+
const { resolvedDirs, directoryAsNamespace, globalNamespaces, collapseSamePrefixes } = options
115115

116116
const parsedFilePath = parse(slash(filePath))
117117

@@ -144,7 +144,30 @@ export function getNameFromFilePath(filePath: string, options: ResolvedOptions):
144144

145145
if (!isEmpty(folders)) {
146146
// add folders to filename
147-
filename = [...folders, filename].filter(Boolean).join('-')
147+
let namespaced = [...folders, filename]
148+
149+
if (collapseSamePrefixes) {
150+
const collapsed: string[] = []
151+
152+
for (const fileOrFolderName of namespaced) {
153+
const collapsedFilename = collapsed.join('')
154+
if (
155+
collapsedFilename
156+
&& fileOrFolderName.toLowerCase().startsWith(collapsedFilename.toLowerCase())
157+
) {
158+
const collapseSamePrefix = fileOrFolderName.slice(collapsedFilename.length)
159+
160+
collapsed.push(collapseSamePrefix)
161+
continue
162+
}
163+
164+
collapsed.push(fileOrFolderName)
165+
}
166+
167+
namespaced = collapsed
168+
}
169+
170+
filename = namespaced.filter(Boolean).join('-')
148171
}
149172

150173
return filename

src/types.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,19 @@ export interface Options {
102102
*/
103103
directoryAsNamespace?: boolean
104104

105+
/**
106+
* Collapse same prefixes (case-insensitive) of folders and components
107+
* to prevent duplication inside namespaced component name
108+
*
109+
* Works when `directoryAsNamespace: true`
110+
* @default false
111+
*/
112+
collapseSamePrefixes?: boolean
113+
105114
/**
106115
* Subdirectory paths for ignoring namespace prefixes
107-
* works when `directoryAsNamespace: true`
116+
*
117+
* Works when `directoryAsNamespace: true`
108118
* @default "[]"
109119
*/
110120
globalNamespaces?: string[]

test/__snapshots__/search.test.ts.snap

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,54 @@
11
// Vitest Snapshot v1
22

3+
exports[`search > should with namespace & collapse 1`] = `
4+
[
5+
{
6+
"as": "Avatar",
7+
"from": "src/components/global/avatar.vue",
8+
},
9+
{
10+
"as": "Book",
11+
"from": "src/components/book/index.vue",
12+
},
13+
{
14+
"as": "CollapseFolderAndComponentPrefixes",
15+
"from": "src/components/collapse/collapseFolderAnd/CollapseFolderAndComponentPrefixes.vue",
16+
},
17+
{
18+
"as": "ComponentA",
19+
"from": "src/components/ComponentA.vue",
20+
},
21+
{
22+
"as": "ComponentAsync",
23+
"from": "src/components/ComponentAsync.vue",
24+
},
25+
{
26+
"as": "ComponentB",
27+
"from": "src/components/ComponentB.vue",
28+
},
29+
{
30+
"as": "ComponentC",
31+
"from": "src/components/component-c.vue",
32+
},
33+
{
34+
"as": "ComponentD",
35+
"from": "src/components/ComponentD.vue",
36+
},
37+
{
38+
"as": "Recursive",
39+
"from": "src/components/Recursive.vue",
40+
},
41+
{
42+
"as": "UiButton",
43+
"from": "src/components/ui/button.vue",
44+
},
45+
{
46+
"as": "UiNestedCheckbox",
47+
"from": "src/components/ui/nested/checkbox.vue",
48+
},
49+
]
50+
`;
51+
352
exports[`search > should with namespace 1`] = `
453
[
554
{
@@ -10,6 +59,10 @@ exports[`search > should with namespace 1`] = `
1059
"as": "Book",
1160
"from": "src/components/book/index.vue",
1261
},
62+
{
63+
"as": "CollapseCollapseFolderAndCollapseFolderAndComponentPrefixes",
64+
"from": "src/components/collapse/collapseFolderAnd/CollapseFolderAndComponentPrefixes.vue",
65+
},
1366
{
1467
"as": "ComponentA",
1568
"from": "src/components/ComponentA.vue",
@@ -63,6 +116,10 @@ exports[`search > should work 1`] = `
63116
"as": "Checkbox",
64117
"from": "src/components/ui/nested/checkbox.vue",
65118
},
119+
{
120+
"as": "CollapseFolderAndComponentPrefixes",
121+
"from": "src/components/collapse/collapseFolderAnd/CollapseFolderAndComponentPrefixes.vue",
122+
},
66123
{
67124
"as": "ComponentA",
68125
"from": "src/components/ComponentA.vue",

test/search.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,16 @@ describe('search', () => {
3131

3232
expect(cleanup(ctx.componentNameMap)).toMatchSnapshot()
3333
})
34+
35+
it('should with namespace & collapse', async () => {
36+
const ctx = new Context({
37+
directoryAsNamespace: true,
38+
collapseSamePrefixes: true,
39+
globalNamespaces: ['global'],
40+
})
41+
ctx.setRoot(root)
42+
ctx.searchGlob()
43+
44+
expect(cleanup(ctx.componentNameMap)).toMatchSnapshot()
45+
})
3446
})

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy