analogjs / analog

The fullstack meta-framework for Angular. Powered by Vite and Nitro
https://analogjs.org
MIT License
2.59k stars 248 forks source link

`Failed to resolve import "angular:jit:template:file;./app.component.html"` error when plugin is loaded twice and jit is enabled #1288

Open yjaaidi opened 2 months ago

yjaaidi commented 2 months ago

Please provide the environment you discovered this bug in.

Running vitest while loading the angular plugin twice in jit mode fails.

import angular from '@analogjs/vite-plugin-angular';

export default defineConfig(({ mode }) => {
  return {
    plugins: [
      angular({jit: true}),
      angular({jit: true})
    ],
    ...
  }
});

This is a black swan edge case that should almost never happen but when it happens it is really hard to debug. I just spent few hours due to an issue with Nx vitest executor which extracts the plugins from the vite config and gives it back to vitest causing the plugins to be loaded twice 😅

Which area/package is the issue in?

vitest-angular

Description

When @analogjs/vite-plugin-angular is loaded twice in vite config and jit mode is enabled the following error happens:

Error: Failed to resolve import "angular:jit:template:file;./app.component.html" from "src/app/app.component.ts". Does the file exist?

Please provide the exception or error you saw

No response

Other information

This seems to happen because the templateUrl is extracted from the source code instead of the TS output.

https://github.com/analogjs/analog/blob/7091444b068e964e5f1f2a94f5298ee38d7e2df3/packages/vite-plugin-angular/src/lib/angular-vite-plugin.ts#L320

I guess that this could be fixed by extracting the template URLs from the transformed data:

https://github.com/analogjs/analog/blob/7091444b068e964e5f1f2a94f5298ee38d7e2df3/packages/vite-plugin-angular/src/lib/angular-vite-plugin.ts#L347

Please let me know if this fix works for you or do you suggest a better alternative?

I would be willing to submit a PR to fix this issue

brandonroberts commented 2 months ago

If we can reliably extract the template and style URLs from the compiled output, that seems reasonable to me.