Skip to content
Closed
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion packages/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@
"title-case": "3.0.3",
"unionfs": "4.6.0",
"uuid": "11.1.0",
"vite-node": "3.2.4",
"yargs": "17.7.2"
},
"devDependencies": {
Expand Down
51 changes: 15 additions & 36 deletions packages/cli/src/lib/exec.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
import path from 'node:path'

import { createServer, version as viteVersion } from 'vite'
import { ViteNodeRunner } from 'vite-node/client'
import { ViteNodeServer } from 'vite-node/server'
import { installSourcemapsSupport } from 'vite-node/source-map'
import { createServer, isRunnableDevEnvironment } from 'vite'

import { getPaths, importStatementPath } from '@cedarjs/project-config'
import {
Expand All @@ -28,10 +25,16 @@ export async function runScriptFunction({
const server = await createServer({
mode: 'production',
optimizeDeps: {
// This is recommended in the vite-node readme
noDiscovery: true,
include: undefined,
},
server: {
hmr: false,
watch: null,
},
environments: {
nodeRunnerEnv: {},
},
resolve: {
alias: [
{
Expand Down Expand Up @@ -97,49 +100,25 @@ export async function runScriptFunction({
],
})

// For old Vite, this is needed to initialize the plugins.
if (Number(viteVersion.split('.')[0]) < 6) {
await server.pluginContainer.buildStart({})
const env = server.environments.nodeRunnerEnv
if (!env || !isRunnableDevEnvironment(env)) {
throw new Error('Vite environment is not runnable.')
}
Comment thread
greptile-apps[bot] marked this conversation as resolved.

const node = new ViteNodeServer(server, {
transformMode: {
ssr: [/.*/],
web: [/\/web\//],
},
deps: {
fallbackCJS: true,
},
})

// fixes stacktraces in Errors
installSourcemapsSupport({
getSourceMap: (source) => node.getSourceMap(source),
})

const runner = new ViteNodeRunner({
root: server.config.root,
base: server.config.base,
fetchModule(id) {
return node.fetchModule(id)
},
resolveId(id, importer) {
return node.resolveId(id, importer)
},
})

let returnValue
let scriptError = null

try {
const script = await runner.executeFile(scriptPath)
const script = await env.runner.import(scriptPath)
returnValue = await script[functionName](args)
} catch (error) {
scriptError = error
}

try {
const { db } = await runner.executeFile(path.join(getPaths().api.lib, 'db'))
const { db } = await env.runner.import(
path.join(getPaths().api.lib, 'db'),
)
db.$disconnect()
} catch (e) {
// silence
Expand Down
3 changes: 1 addition & 2 deletions packages/prerender/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,7 @@
"rollup-plugin-swc3": "0.12.1",
"unimport": "5.7.0",
"unplugin-auto-import": "19.3.0",
"vite": "7.3.2",
"vite-node": "3.2.4"
"vite": "7.3.2"
},
"devDependencies": {
"@cedarjs/framework-tools": "workspace:*",
Expand Down
54 changes: 17 additions & 37 deletions packages/prerender/src/graphql/node-runner.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import { createServer, version as viteVersion, mergeConfig } from 'vite'
import type { ViteDevServer, UserConfig } from 'vite'
import { ViteNodeRunner } from 'vite-node/client'
import { ViteNodeServer } from 'vite-node/server'
import { installSourcemapsSupport } from 'vite-node/source-map'
import { createServer, isRunnableDevEnvironment, mergeConfig } from 'vite'
import type { ViteDevServer, RunnableDevEnvironment, UserConfig } from 'vite'

import { getPaths } from '@cedarjs/project-config'
import {
Expand All @@ -19,10 +16,16 @@ async function createViteServer(customConfig: UserConfig = {}) {
const defaultConfig: UserConfig = {
mode: 'production',
optimizeDeps: {
// This is recommended in the vite-node readme
noDiscovery: true,
include: undefined,
},
server: {
hmr: false,
watch: null,
},
environments: {
nodeRunnerEnv: {},
},
resolve: {
alias: [
{
Expand All @@ -45,17 +48,12 @@ async function createViteServer(customConfig: UserConfig = {}) {

const server = await createServer(mergedConfig)

// For old Vite, this is needed to initialize the plugins.
if (Number(viteVersion.split('.')[0]) < 6) {
await server.pluginContainer.buildStart({})
}

return server
}

export class NodeRunner {
private viteServer?: ViteDevServer = undefined
private runner?: ViteNodeRunner = undefined
private env?: RunnableDevEnvironment = undefined
private readonly customViteConfig: UserConfig

constructor(customViteConfig: UserConfig = {}) {
Expand All @@ -64,39 +62,21 @@ export class NodeRunner {

async init() {
this.viteServer = await createViteServer(this.customViteConfig)
const nodeServer = new ViteNodeServer(this.viteServer, {
transformMode: {
ssr: [/.*/],
web: [/\/web\//],
},
deps: {
fallbackCJS: true,
},
})

// fixes stacktraces in Errors
installSourcemapsSupport({
getSourceMap: (source) => nodeServer?.getSourceMap(source),
})
const env = this.viteServer.environments.nodeRunnerEnv
if (!env || !isRunnableDevEnvironment(env)) {
throw new Error('Vite environment is not runnable.')
}
Comment on lines +66 to +69
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 If isRunnableDevEnvironment returns false, this.viteServer has already been created and assigned but is never closed before the error is thrown. This leaves file watchers and potentially a listening port open. exec.js handles the identical guard correctly with await server.close() before throwing — the same pattern should be applied here.

Suggested change
const env = this.viteServer.environments.nodeRunnerEnv
if (!env || !isRunnableDevEnvironment(env)) {
throw new Error('Vite environment is not runnable.')
}
const env = this.viteServer.environments.nodeRunnerEnv
if (!env || !isRunnableDevEnvironment(env)) {
await this.viteServer.close()
throw new Error('Vite environment is not runnable.')
}


this.runner = new ViteNodeRunner({
root: this.viteServer.config.root,
base: this.viteServer.config.base,
fetchModule(id) {
return nodeServer.fetchModule(id)
},
resolveId(id, importer) {
return nodeServer.resolveId(id, importer)
},
})
this.env = env
}

async importFile(filePath: string) {
if (!this.runner) {
if (!this.env) {
await this.init()
}

return this.runner?.executeFile(filePath)
return this.env?.runner.import(filePath)
Comment thread
greptile-apps[bot] marked this conversation as resolved.
Outdated
}

async close() {
Expand Down
Loading