summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rw-r--r--js/compiler.ts65
-rw-r--r--js/compiler_test.ts33
2 files changed, 62 insertions, 36 deletions
diff --git a/js/compiler.ts b/js/compiler.ts
index 84330490f..fcbfc7c5e 100644
--- a/js/compiler.ts
+++ b/js/compiler.ts
@@ -17,11 +17,6 @@ type AmdErrback = (err: any) => void;
export type AmdFactory = (...args: any[]) => object | void;
// tslint:enable:no-any
export type AmdDefine = (deps: string[], factory: AmdFactory) => void;
-type AmdRequire = (
- deps: string[],
- callback: AmdCallback,
- errback?: AmdErrback
-) => void;
// The location that a module is being loaded from. This could be a directory,
// like ".", or it could be a module specifier like
@@ -264,44 +259,42 @@ export class DenoCompiler implements ts.LanguageServiceHost {
const localDefine = (deps: string[], factory: AmdFactory): void => {
// TypeScript will emit a local require dependency when doing dynamic
// `import()`
- const localRequire: AmdRequire = (
+ const { _log: log } = this;
+ const localExports = moduleMetaData.exports;
+
+ // tslint:disable-next-line:no-any
+ const resolveDependencies = (deps: string[]): any[] => {
+ return deps.map(dep => {
+ if (dep === "require") {
+ return localRequire;
+ } else if (dep === "exports") {
+ return localExports;
+ } else if (dep in DenoCompiler._builtins) {
+ return DenoCompiler._builtins[dep];
+ } else {
+ const depModuleMetaData = this.run(dep, moduleMetaData.fileName);
+ return depModuleMetaData.exports;
+ }
+ });
+ };
+
+ // this is a function because we need hoisting
+ function localRequire(
deps: string[],
callback: AmdCallback,
- errback?: AmdErrback
- ): void => {
- this._log("localRequire", deps);
+ errback: AmdErrback
+ ): void {
+ log("localRequire", deps);
try {
- const args = deps.map(dep => {
- if (dep in DenoCompiler._builtins) {
- return DenoCompiler._builtins[dep];
- } else {
- const depModuleMetaData = this.run(dep, moduleMetaData.fileName);
- return depModuleMetaData.exports;
- }
- });
+ const args = resolveDependencies(deps);
callback(...args);
} catch (e) {
- if (errback) {
- errback(e);
- } else {
- throw e;
- }
+ errback(e);
}
- };
- const localExports = moduleMetaData.exports;
+ }
+
this._log("localDefine", moduleMetaData.fileName, deps, localExports);
- const args = deps.map(dep => {
- if (dep === "require") {
- return localRequire;
- } else if (dep === "exports") {
- return localExports;
- } else if (dep in DenoCompiler._builtins) {
- return DenoCompiler._builtins[dep];
- } else {
- const depModuleMetaData = this.run(dep, moduleMetaData.fileName);
- return depModuleMetaData.exports;
- }
- });
+ const args = resolveDependencies(deps);
factory(...args);
};
return localDefine;
diff --git a/js/compiler_test.ts b/js/compiler_test.ts
index d8861e2a9..cc3cda406 100644
--- a/js/compiler_test.ts
+++ b/js/compiler_test.ts
@@ -108,6 +108,12 @@ const moduleMap: {
"/root/project/foo/bar.ts",
fooBarTsSource,
fooBarTsOutput
+ ),
+ "./qat.ts": mockModuleInfo(
+ "foo/qat",
+ "/root/project/foo/qat.ts",
+ "export const foo = 'bar'",
+ null
)
}
};
@@ -275,6 +281,33 @@ test(function compilerMakeDefine() {
// external modules, this is implicitly tested though in
// `compilerRunMultiModule`
+test(function compilerLocalRequire() {
+ const moduleMetaData = new ModuleMetaData(
+ "/root/project/foo/baz.ts",
+ fooBazTsSource,
+ fooBazTsOutput
+ );
+ const localDefine = compilerInstance.makeDefine(moduleMetaData);
+ let requireCallbackCalled = false;
+ localDefine(
+ ["require", "exports"],
+ (_require, _exports, _compiler): void => {
+ assertEqual(typeof _require, "function");
+ _require(
+ ["./qat.ts"],
+ _qat => {
+ requireCallbackCalled = true;
+ assert(_qat);
+ },
+ () => {
+ throw new Error("Should not error");
+ }
+ );
+ }
+ );
+ assert(requireCallbackCalled, "Factory expected to be called");
+});
+
test(function compilerRun() {
// equal to `deno foo/bar.ts`
reset();