ResolverHelper.ts
45 lines
| 1.4 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r59 | import { Uuid } from "../Uuid"; | ||
|
|
r73 | import { argumentNotEmptyString, getGlobal } from "../safe"; | ||
|
|
r71 | import { TraceSource } from "../log/TraceSource"; | ||
|
|
r59 | import m = require("module"); | ||
| const sandboxId = Uuid(); | ||||
|
|
r99 | define(sandboxId, ["require"], (r: any) => r); | ||
|
|
r59 | |||
|
|
r73 | const globalRequire = getGlobal().require as Require || requirejs; | ||
|
|
r59 | |||
| const trace = TraceSource.get(m.id); | ||||
|
|
r73 | trace.debug("globalRequire = {0}", globalRequire); | ||
|
|
r59 | |||
| class ModuleResolver { | ||||
| _base: string; | ||||
| _require: Require; | ||||
| constructor(req: Require, base?: string) { | ||||
| this._base = base; | ||||
|
|
r71 | this._require = req; | ||
|
|
r59 | } | ||
| resolve(moduleName: string) { | ||||
| argumentNotEmptyString(moduleName, "moduleName"); | ||||
| const resolvedName = moduleName[0] === "." && this._base ? [this._base, moduleName].join("/") : moduleName; | ||||
| trace.debug(`${moduleName} -> ${resolvedName}`); | ||||
| const req = this._require; | ||||
| return new Promise<any>((cb, eb) => { | ||||
| req([resolvedName], cb, eb); | ||||
| }); | ||||
| } | ||||
| } | ||||
|
|
r71 | export function makeResolver(moduleName: string, contextRequire: Require) { | ||
| const base = moduleName && moduleName.split("/").slice(0, -1).join("/"); | ||||
|
|
r60 | |||
|
|
r73 | const req = contextRequire || globalRequire; | ||
| if (!req) | ||||
| throw new Error("A global require isn't defined, the contextRequire parameter is mandatory"); | ||||
| const resolver = new ModuleResolver(req, base); | ||||
|
|
r59 | return (id: string) => resolver.resolve(id); | ||
| } | ||||
