diff --git a/index.ts b/index.ts index 8d6878b..9aaf67b 100644 --- a/index.ts +++ b/index.ts @@ -1,5 +1,6 @@ import { spawn, SpawnOptions } from "child_process"; import type { Plugin as VitePlugin } from "vite"; +import fs from "fs"; // Utility to invoke a given sbt task and fetch its output function printSbtTask(task: string, cwd?: string): Promise { @@ -33,7 +34,13 @@ function printSbtTask(task: string, cwd?: string): Promise { } reject(new Error(errorMessage)); } else { - resolve(fullOutput.trimEnd().split('\n').at(-1)!); + const separator = process.platform === 'win32' ? '\r\n' : '\n'; + const lines = fullOutput.trimEnd().split(separator); + const withoutLog = lines.filter(line => !line.startsWith('[')); + const pathExists = withoutLog.filter(line => fs.existsSync(line)); + pathExists.length > 0 + ? resolve(pathExists.at(-1)!) + : reject(new Error(`Couldn't find a valid path in sbt output: ${fullOutput}`)); } }); }); diff --git a/test/plugin.test.ts b/test/plugin.test.ts index f48f503..af93600 100644 --- a/test/plugin.test.ts +++ b/test/plugin.test.ts @@ -52,7 +52,10 @@ describe("scalaJSPlugin", () => { await plugin.configResolved.call(undefined, { mode: MODE_PRODUCTION }); await plugin.buildStart.call(fakePluginContext, {}); - expect(normalizeSlashes(await plugin.resolveId.call(fakePluginContext, 'scalajs:main.js'))) + const path = await plugin.resolveId.call(fakePluginContext, 'scalajs:main.js'); + const normalized = normalizeSlashes(path); + + expect(normalized) .toContain('/testproject/target/scala-3.2.2/testproject-opt/main.js'); expect(await plugin.resolveId.call(fakePluginContext, 'scalajs/main.js')) @@ -65,7 +68,10 @@ describe("scalaJSPlugin", () => { await plugin.configResolved.call(undefined, { mode: MODE_DEVELOPMENT }); await plugin.buildStart.call(fakePluginContext, {}); - expect(normalizeSlashes(await plugin.resolveId.call(fakePluginContext, 'scalajs:main.js'))) + const path = await plugin.resolveId.call(fakePluginContext, 'scalajs:main.js'); + const normalized = normalizeSlashes(path); + + expect(normalized) .toContain('/testproject/target/scala-3.2.2/testproject-fastopt/main.js'); expect(await plugin.resolveId.call(fakePluginContext, 'scalajs/main.js')) @@ -80,7 +86,10 @@ describe("scalaJSPlugin", () => { await plugin.configResolved.call(undefined, { mode: MODE_PRODUCTION }); await plugin.buildStart.call(fakePluginContext, {}); - expect(normalizeSlashes(await plugin.resolveId.call(fakePluginContext, 'scalajs:main.js'))) + const path = await plugin.resolveId.call(fakePluginContext, 'scalajs:main.js'); + const normalized = normalizeSlashes(path); + + expect(normalized) .toContain('/testproject/other-project/target/scala-3.2.2/otherproject-opt/main.js'); expect(await plugin.resolveId.call(fakePluginContext, 'scalajs/main.js')) @@ -95,7 +104,10 @@ describe("scalaJSPlugin", () => { await plugin.configResolved.call(undefined, { mode: MODE_DEVELOPMENT }); await plugin.buildStart.call(fakePluginContext, {}); - expect(normalizeSlashes(await plugin.resolveId.call(fakePluginContext, 'customsjs:main.js'))) + const path = await plugin.resolveId.call(fakePluginContext, 'customsjs:main.js'); + const normalized = normalizeSlashes(path); + + expect(normalized) .toContain('/testproject/target/scala-3.2.2/testproject-fastopt/main.js'); expect(await plugin.resolveId.call(fakePluginContext, 'scalajs:main.js')) diff --git a/test/testproject/.sbtopts b/test/testproject/.sbtopts new file mode 100644 index 0000000..bb43c5b --- /dev/null +++ b/test/testproject/.sbtopts @@ -0,0 +1,3 @@ +-Dsbt.task.timings=true +-Dsbt.task.timings.unit=s +-Dsbt.task.timings.on.shutdown=true \ No newline at end of file