mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-30 07:05:24 +00:00
fix: let commonjs plugins fall back to core packages on the desktop
This commit is contained in:
1 parent
b211311530
commit
d43f543c59
3 files changed
+52
-3
No files matched your search
@@ -38,6 +38,20 @@ export function isUserPluginFile(
|
||||
);
|
||||
}
|
||||
|
||||
/** Whether a failed import from a plugin should try core's copy. */
|
||||
export function shouldUseHostModule(
|
||||
error: unknown,
|
||||
specifier: string,
|
||||
parentURL: string | undefined,
|
||||
pluginsDir: string,
|
||||
): boolean {
|
||||
const code = (error as { code?: string })?.code;
|
||||
// import() says ERR_MODULE_NOT_FOUND, a CommonJS require MODULE_NOT_FOUND.
|
||||
if (code !== "ERR_MODULE_NOT_FOUND" && code !== "MODULE_NOT_FOUND")
|
||||
return false;
|
||||
return isBareSpecifier(specifier) && isUserPluginFile(parentURL, pluginsDir);
|
||||
}
|
||||
|
||||
export function installHostModuleFallback(): void {
|
||||
if (installed) return;
|
||||
installed = true;
|
||||
@@ -49,9 +63,12 @@ export function installHostModuleFallback(): void {
|
||||
return nextResolve(specifier, context);
|
||||
} catch (error) {
|
||||
if (
|
||||
(error as { code?: string })?.code !== "ERR_MODULE_NOT_FOUND" ||
|
||||
!isBareSpecifier(specifier) ||
|
||||
!isUserPluginFile(context.parentURL, getPluginsDir())
|
||||
!shouldUseHostModule(
|
||||
error,
|
||||
specifier,
|
||||
context.parentURL,
|
||||
getPluginsDir(),
|
||||
)
|
||||
) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import { afterEach, describe, expect, it } from "vitest";
|
||||
import {
|
||||
isBareSpecifier,
|
||||
isUserPluginFile,
|
||||
shouldUseHostModule,
|
||||
} from "../../plugins/host-modules.js";
|
||||
|
||||
describe("isBareSpecifier", () => {
|
||||
@@ -46,6 +47,36 @@ describe("isUserPluginFile", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("shouldUseHostModule", () => {
|
||||
const root = path.resolve(os.tmpdir(), "termix-data", "plugins");
|
||||
const parent = pathToFileURL(
|
||||
path.join(root, ".unpacked", "demo", "dist", "backend.js"),
|
||||
).href;
|
||||
|
||||
it("falls back for import and require misses from a plugin", () => {
|
||||
for (const code of ["ERR_MODULE_NOT_FOUND", "MODULE_NOT_FOUND"]) {
|
||||
expect(shouldUseHostModule({ code }, "axios", parent, root)).toBe(true);
|
||||
}
|
||||
});
|
||||
|
||||
it("leaves other errors and files alone", () => {
|
||||
expect(
|
||||
shouldUseHostModule({ code: "ERR_REQUIRE_ESM" }, "axios", parent, root),
|
||||
).toBe(false);
|
||||
expect(
|
||||
shouldUseHostModule({ code: "MODULE_NOT_FOUND" }, "./x.js", parent, root),
|
||||
).toBe(false);
|
||||
expect(
|
||||
shouldUseHostModule(
|
||||
{ code: "MODULE_NOT_FOUND" },
|
||||
"axios",
|
||||
undefined,
|
||||
root,
|
||||
),
|
||||
).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe("installHostModuleFallback", () => {
|
||||
let dataDir: string | null = null;
|
||||
|
||||
|
||||
Reference in new issue
Block a user