From a6e700cafbc58e4364e3ae9266488846ad00a2d3 Mon Sep 17 00:00:00 2001 From: Julian Meinking <12785972+DrJume@users.noreply.github.com> Date: Wed, 21 Dec 2022 11:05:14 +0100 Subject: [PATCH] fix(collapseSamePrefixes): missing collapse when prefix did not match from beginning (#563) Fixes https://github.com/antfu/unplugin-vue-components/issues/546 --- .vscode/settings.json | 3 ++- README.md | 7 ++++- .../CollapseFolderAndComponentFromRoot.vue | 9 +++++++ .../FolderAndComponentPartially.vue | 9 +++++++ .../CollapseFolderAndComponentPrefixes.vue | 9 ------- src/core/utils.ts | 26 ++++++++++++------- src/types.ts | 4 +-- test/__snapshots__/search.test.ts.snap | 24 ++++++++++++----- 8 files changed, 62 insertions(+), 29 deletions(-) create mode 100644 examples/vite-vue3/src/components/collapse/collapseFolder/CollapseFolderAndComponentFromRoot.vue create mode 100644 examples/vite-vue3/src/components/collapse/collapseFolder/FolderAndComponentPartially.vue delete mode 100644 examples/vite-vue3/src/components/collapse/collapseFolderAnd/CollapseFolderAndComponentPrefixes.vue 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 @@ + + + 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 @@ + + + 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 @@ - - - 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",