ResolverHelper.ts
74 lines
| 2.2 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r59 | import { Uuid } from "../Uuid"; | ||
|
|
r65 | import { argumentNotEmptyString, getGlobal, isNullOrEmptyString } from "../safe"; | ||
|
|
r59 | import { TraceSource, DebugLevel } from "../log/TraceSource"; | ||
| import m = require("module"); | ||||
| const sandboxId = Uuid(); | ||||
| define(sandboxId, ["require"], r => r); | ||||
| // tslint:disable-next-line:no-var-requires | ||||
|
|
r65 | const globalRequire = getGlobal().require as Require; | ||
|
|
r59 | |||
| const trace = TraceSource.get(m.id); | ||||
| export async function createContextRequire(moduleName: string): Promise<Require> { | ||||
| argumentNotEmptyString(moduleName, "moduleName"); | ||||
| const parts = moduleName.split("/"); | ||||
| if (parts[0] === ".") | ||||
| throw new Error("An absolute module path is required"); | ||||
| if (parts.length > 1) | ||||
| parts.splice(-1, 1, Uuid()); | ||||
| else | ||||
| parts.push(Uuid()); | ||||
| const shim = parts.join("/"); | ||||
| trace.debug(`define shim ${shim}`); | ||||
| return new Promise<Require>(cb => { | ||||
| define(shim, ["require"], r => { | ||||
| trace.debug("shim resolved"); | ||||
| return r; | ||||
| }); | ||||
| require([shim], cb); | ||||
| }); | ||||
| } | ||||
| class ModuleResolver { | ||||
| _base: string; | ||||
| _require: Require; | ||||
| constructor(req: Require, base?: string) { | ||||
| this._base = base; | ||||
| this._require = req || globalRequire; | ||||
| } | ||||
| 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); | ||||
| }); | ||||
| } | ||||
| } | ||||
|
|
r65 | export async function makeResolver(moduleName: string, contextRequire: Require) { | ||
|
|
r60 | trace.debug( | ||
| "makeResolver moduleName={0}, contextRequire={1}", | ||||
| moduleName || "<nil>", | ||||
| contextRequire ? typeof (contextRequire) : "<nil>" | ||||
| ); | ||||
|
|
r65 | const nestedRequire = isNullOrEmptyString(moduleName) ? null : await createContextRequire(moduleName); | ||
|
|
r59 | |||
|
|
r65 | // const base = moduleName && moduleName.split("/").slice(0, -1).join("/"); | ||
| const resolver = new ModuleResolver(nestedRequire, null); | ||||
|
|
r59 | return (id: string) => resolver.resolve(id); | ||
| } | ||||
