astro-fastify
astro-fastify copied to clipboard
Issue importing local TS files from entry
The following is the code my entry points to:
import type { FastifyCookieOptions } from '@fastify/cookie';
import type { DefineFastifyRoutes } from '@matthewp/astro-fastify';
import { fastifyTRPCPlugin } from '@trpc/server/adapters/fastify';
import { createApiContext } from './api-context.js' // fails;
import { env } from './env.js'; // fails
import { apiRouter } from './routes/index.js'; // fails
const defineRoutes: DefineFastifyRoutes = async (fastify) => {
const cookieOption: FastifyCookieOptions = {
secret: env.JWT_SECRET,
}
fastify
.register(import('fastify-graceful-shutdown'))
.register(import('@fastify/websocket'))
.register(import('@fastify/cookie'), cookieOption)
.register(import('@fastify/csrf-protection'))
.register(fastifyTRPCPlugin, {
prefix: '/trpc',
useWSS: true,
trpcOptions: { router: apiRouter, createContext: createApiContext },
})
};
export default defineRoutes;
All the local imports fail with:
Failed to load url ./api-context.ts (resolved id: ./api-context.ts). Does the file exist?
Do you know what's happening?
I'm having the same issue. It seems that the vite.ssrLoadModule (https://github.com/matthewp/astro-fastify/blob/main/lib/index.js#LL53C42-L53C55) is not respecting the relative path. If you want to try to load the files from the root it works.
Like if you have the api located in: ./api/index.ts try to load the rest of the paths as import { createApiContext } from './api/api-context.js'
anyway is not a good solution, i know
the kinda solution is to put main.ts (the file where defineRoutes is called) in the project root. This automatically makes your imports "from root".
@smnbbrv Hi! I'd like to use your tip, but the problem seems to resurface as soon as a relative import is used, so it is hard to modularize any serious fastify related code used from this entry point. What would really need to be fixed regarding the mentioned ssrLoadModule thing (if @tinchoz49's assumption in https://github.com/matthewp/astro-fastify/issues/21#issuecomment-1574313765 is correct)? I'd love to help.
+1 for a fix for this. Such a great dev experience having HMR!
I don't understand this issue. Are you all passing a URL to entry like in the example? If you're passing ./entry.ts or something then I would expect it not to work.
I've attached a minimal recreation for you here. But basically to recreate the issue I:
- Install
astro(npm create astro@latest) - Install
astro-fastifyas per readme (everything works fine up to this point) - Add a new folder
./api/liband create a file todo.ts. Importfile from 3 inside./api/index.ts- Restart everything and receive the error
14:42:42 [ERROR] [content] Failed to load url ./lib/todos (resolved id: ./lib/todos). Does the file exist?
Archive.zip
To use the zip file, just npm install
Thanks for the reproduction! I'm not sure what would cause this, but I think I have a good idea to fix it either way.
I've looked into this a bit but haven't been able to figure it out yet. Inside Vite it seems to resolving these modules without providing the parent module to resolve relative, and I'm not sure why it's doing that. Will keep you updated.
thank you @matthewp !
I am unable to find any related issue in the vite repo, and while trying to create a minimal reproduction using createViteServer as described in vite docs the imports work fine. stackblitz
Could this be related to astro's vite config or at astro level? or can someone link me to an existing issue? or should i file one in astro and see where that goes?
Trying to move to astro at work but this import issue is the only blocker for a week.
thanks for this adapter & astro tho :)