diff --git a/.vscode/settings.json b/.vscode/settings.json
index 25fa6215..5cc1fb10 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,3 +1,4 @@
{
- "typescript.tsdk": "node_modules/typescript/lib"
+ "typescript.tsdk": "node_modules/typescript/lib",
+ "prettier.enable": false
}
diff --git a/README.md b/README.md
index c5f2969b..050853c8 100644
--- a/README.md
+++ b/README.md
@@ -338,7 +338,12 @@ Components({
// Allow subdirectories as namespace prefix for components.
directoryAsNamespace: false,
- // Subdirectory paths for ignoring namespace prefixes
+
+ // Collapse same prefixes (camel-sensitive) of folders and components
+ // to prevent duplication inside namespaced component name.
+ // works when `directoryAsNamespace: true`
+ collapseSamePrefixes: false,
+ // Subdirectory paths for ignoring namespace prefixes.
// works when `directoryAsNamespace: true`
globalNamespaces: [],
diff --git a/examples/vite-vue3/src/components/collapse/collapseFolder/CollapseFolderAndComponentFromRoot.vue b/examples/vite-vue3/src/components/collapse/collapseFolder/CollapseFolderAndComponentFromRoot.vue
new file mode 100644
index 00000000..373e0836
--- /dev/null
+++ b/examples/vite-vue3/src/components/collapse/collapseFolder/CollapseFolderAndComponentFromRoot.vue
@@ -0,0 +1,9 @@
+
+
+
+ CollapseFolderAndComponentFromRoot Component: collapse/collapseFolder/CollapseFolderAndComponentFromRoot.vue
+
diff --git a/examples/vite-vue3/src/components/collapse/collapseFolder/FolderAndComponentPartially.vue b/examples/vite-vue3/src/components/collapse/collapseFolder/FolderAndComponentPartially.vue
new file mode 100644
index 00000000..b018f6ac
--- /dev/null
+++ b/examples/vite-vue3/src/components/collapse/collapseFolder/FolderAndComponentPartially.vue
@@ -0,0 +1,9 @@
+
+
+
+ FolderAndComponentPartially Component: collapse/collapseFolder/FolderAndComponentPartially.vue
+
diff --git a/examples/vite-vue3/src/components/collapse/collapseFolderAnd/CollapseFolderAndComponentPrefixes.vue b/examples/vite-vue3/src/components/collapse/collapseFolderAnd/CollapseFolderAndComponentPrefixes.vue
deleted file mode 100644
index ba1ae0c8..00000000
--- a/examples/vite-vue3/src/components/collapse/collapseFolderAnd/CollapseFolderAndComponentPrefixes.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
- CollapseFolderAndComponentPrefixes Component: collapse/collapseFolderAnd/CollapseFolderAndComponentPrefixes.vue
-
diff --git a/src/core/utils.ts b/src/core/utils.ts
index 9b2e774c..0fcf6444 100644
--- a/src/core/utils.ts
+++ b/src/core/utils.ts
@@ -156,18 +156,24 @@ export function getNameFromFilePath(filePath: string, options: ResolvedOptions):
const collapsed: string[] = []
for (const fileOrFolderName of namespaced) {
- const collapsedFilename = collapsed.join('')
- if (
- collapsedFilename
- && fileOrFolderName.toLowerCase().startsWith(collapsedFilename.toLowerCase())
- ) {
- const collapseSamePrefix = fileOrFolderName.slice(collapsedFilename.length)
-
- collapsed.push(collapseSamePrefix)
- continue
+ let cumulativePrefix = ''
+ let didCollapse = false
+
+ for (const parentFolder of [...collapsed].reverse()) {
+ cumulativePrefix = `${capitalize(parentFolder)}${cumulativePrefix}`
+
+ if (pascalCase(fileOrFolderName).startsWith(pascalCase(cumulativePrefix))) {
+ const collapseSamePrefix = fileOrFolderName.slice(cumulativePrefix.length)
+
+ collapsed.push(collapseSamePrefix)
+
+ didCollapse = true
+ break
+ }
}
- collapsed.push(fileOrFolderName)
+ if (!didCollapse)
+ collapsed.push(fileOrFolderName)
}
namespaced = collapsed
diff --git a/src/types.ts b/src/types.ts
index f8d52c0e..c6c2299a 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -103,8 +103,8 @@ export interface Options {
directoryAsNamespace?: boolean
/**
- * Collapse same prefixes (case-insensitive) of folders and components
- * to prevent duplication inside namespaced component name
+ * Collapse same prefixes (camel-sensitive) of folders and components
+ * to prevent duplication inside namespaced component name.
*
* Works when `directoryAsNamespace: true`
* @default false
diff --git a/test/__snapshots__/search.test.ts.snap b/test/__snapshots__/search.test.ts.snap
index ed67ec9e..27284a11 100644
--- a/test/__snapshots__/search.test.ts.snap
+++ b/test/__snapshots__/search.test.ts.snap
@@ -11,8 +11,12 @@ exports[`search > should with namespace & collapse 1`] = `
"from": "src/components/book/index.vue",
},
{
- "as": "CollapseFolderAndComponentPrefixes",
- "from": "src/components/collapse/collapseFolderAnd/CollapseFolderAndComponentPrefixes.vue",
+ "as": "CollapseFolderAndComponentFromRoot",
+ "from": "src/components/collapse/collapseFolder/CollapseFolderAndComponentFromRoot.vue",
+ },
+ {
+ "as": "CollapseFolderAndComponentPartially",
+ "from": "src/components/collapse/collapseFolder/FolderAndComponentPartially.vue",
},
{
"as": "ComponentA",
@@ -60,8 +64,12 @@ exports[`search > should with namespace 1`] = `
"from": "src/components/book/index.vue",
},
{
- "as": "CollapseCollapseFolderAndCollapseFolderAndComponentPrefixes",
- "from": "src/components/collapse/collapseFolderAnd/CollapseFolderAndComponentPrefixes.vue",
+ "as": "CollapseCollapseFolderCollapseFolderAndComponentFromRoot",
+ "from": "src/components/collapse/collapseFolder/CollapseFolderAndComponentFromRoot.vue",
+ },
+ {
+ "as": "CollapseCollapseFolderFolderAndComponentPartially",
+ "from": "src/components/collapse/collapseFolder/FolderAndComponentPartially.vue",
},
{
"as": "ComponentA",
@@ -117,8 +125,8 @@ exports[`search > should work 1`] = `
"from": "src/components/ui/nested/checkbox.vue",
},
{
- "as": "CollapseFolderAndComponentPrefixes",
- "from": "src/components/collapse/collapseFolderAnd/CollapseFolderAndComponentPrefixes.vue",
+ "as": "CollapseFolderAndComponentFromRoot",
+ "from": "src/components/collapse/collapseFolder/CollapseFolderAndComponentFromRoot.vue",
},
{
"as": "ComponentA",
@@ -140,6 +148,10 @@ exports[`search > should work 1`] = `
"as": "ComponentD",
"from": "src/components/ComponentD.vue",
},
+ {
+ "as": "FolderAndComponentPartially",
+ "from": "src/components/collapse/collapseFolder/FolderAndComponentPartially.vue",
+ },
{
"as": "Recursive",
"from": "src/components/Recursive.vue",