Skip to content

Commit

Permalink
feat(js): support finding imports in .vue files
Browse files Browse the repository at this point in the history
  • Loading branch information
FrozenPandaz committed Sep 7, 2023
1 parent 1572749 commit 647f24e
Show file tree
Hide file tree
Showing 2 changed files with 130 additions and 0 deletions.
115 changes: 115 additions & 0 deletions packages/nx/src/native/plugins/js/ts_import_locators.rs
Original file line number Diff line number Diff line change
Expand Up @@ -816,6 +816,121 @@ import 'a4'; import 'a5';
);
}

#[test]
fn should_find_imports_in_vue_files() {
let temp_dir = TempDir::new().unwrap();
temp_dir
.child("test.vue")
.write_str(
r#"
<script setup lang="ts">
import { VueComponent } from './component.vue'
import('./dynamic-import.vue')
</script>
<template>
<WelcomeItem>
<template #icon>
<DocumentationIcon />
</template>
<template #heading>Documentation</template>
Vue’s
<a href="https://vuejs.org/" target="_blank" rel="noopener">official documentation</a>
provides you with all information you need to get started.
</WelcomeItem>
<WelcomeItem>
<template #icon>
<ToolingIcon />
</template>
<template #heading>Tooling</template>
This project is served and bundled with
<a href="https://vitejs.dev/guide/features.html" target="_blank" rel="noopener">Vite</a>. The
recommended IDE setup is
<a href="https://code.visualstudio.com/" target="_blank" rel="noopener">VSCode</a> +
<a href="https://github.com/johnsoncodehk/volar" target="_blank" rel="noopener">Volar</a>. If
you need to test your components and web pages, check out
<a href="https://www.cypress.io/" target="_blank" rel="noopener">Cypress</a> and
<a href="https://on.cypress.io/component" target="_blank">Cypress Component Testing</a>.
<br />
More instructions are available in <code>README.md</code>.
</WelcomeItem>
<WelcomeItem>
<template #icon>
<EcosystemIcon />
</template>
<template #heading>Ecosystem</template>
Get official tools and libraries for your project:
<a href="https://pinia.vuejs.org/" target="_blank" rel="noopener">Pinia</a>,
<a href="https://router.vuejs.org/" target="_blank" rel="noopener">Vue Router</a>,
<a href="https://test-utils.vuejs.org/" target="_blank" rel="noopener">Vue Test Utils</a>, and
<a href="https://github.com/vuejs/devtools" target="_blank" rel="noopener">Vue Dev Tools</a>. If
you need more resources, we suggest paying
<a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">Awesome Vue</a>
a visit.
</WelcomeItem>
<WelcomeItem>
<template #icon>
<CommunityIcon />
</template>
<template #heading>Community</template>
Got stuck? Ask your question on
<a href="https://chat.vuejs.org" target="_blank" rel="noopener">Vue Land</a>, our official
Discord server, or
<a href="https://stackoverflow.com/questions/tagged/vue.js" target="_blank" rel="noopener"
>StackOverflow</a
>. You should also subscribe to
<a href="https://news.vuejs.org" target="_blank" rel="noopener">our mailing list</a> and follow
the official
<a href="https://twitter.com/vuejs" target="_blank" rel="noopener">@vuejs</a>
twitter account for latest news in the Vue world.
</WelcomeItem>
<WelcomeItem>
<template #icon>
<SupportIcon />
</template>
<template #heading>Support Vue</template>
As an independent project, Vue relies on community backing for its sustainability. You can help
us by
<a href="https://vuejs.org/sponsor/" target="_blank" rel="noopener">becoming a sponsor</a>.
</WelcomeItem>
</template>
"#,
)
.unwrap();

let test_file_path = temp_dir.display().to_string() + "/test.vue";

let results = find_imports(HashMap::from([(
String::from("a"),
vec![test_file_path.clone()],
)]));

let result = results.get(0).unwrap();

assert_eq!(
result.static_import_expressions,
vec![String::from("./component.vue")]
);
assert_eq!(
result.dynamic_import_expressions,
vec![String::from("./dynamic-import.vue")]
);
}

#[test]
fn should_find_imports_in_all_sorts_of_import_statements() {
let temp_dir = TempDir::new().unwrap();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ export function buildExplicitTypeScriptDependencies({

const moduleExtensions = ['.ts', '.js', '.tsx', '.jsx', '.mts', '.mjs'];

// TODO: This can be removed when vue is stable
if (isVuePluginInstalled()) {
moduleExtensions.push('.vue');
}

for (const [project, fileData] of Object.entries(fileMap)) {
filesToProcess[project] ??= [];
for (const { file } of fileData) {
Expand Down Expand Up @@ -103,3 +108,13 @@ export function buildExplicitTypeScriptDependencies({

return res;
}

function isVuePluginInstalled() {
try {
// nx-ignore-next-line
require.resolve('@nx/vue');
return true;
} catch {
return false;
}
}

0 comments on commit 647f24e

Please sign in to comment.