Skip to content

Commit b86b1a3

Browse files
authoredJun 3, 2022
feat: add 'collapseSamePrefixes' option to prevent duplication inside namespaced component name (#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
 
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

+25-2
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

+11-1
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

+57
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

+12
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)