Skip to content

Commit

Permalink
Prevent circular imports in ts code (denoland#576)
Browse files Browse the repository at this point in the history
  • Loading branch information
FrancescoBorzi authored and ry committed Aug 25, 2018
1 parent 3bcf7e2 commit 84c38f3
Show file tree
Hide file tree
Showing 12 changed files with 42 additions and 26 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Cargo.lock
yarn.lock
# npm deps
node_modules
.idea

# RLS generated files
/target/
2 changes: 2 additions & 0 deletions js/assets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import compilerDts from "gen/js/compiler.d.ts!string";
import consoleDts from "gen/js/console.d.ts!string";
import denoDts from "gen/js/deno.d.ts!string";
import libdenoDts from "gen/js/libdeno.d.ts!string";
import globalsDts from "gen/js/globals.d.ts!string";
import osDts from "gen/js/os.d.ts!string";
import fetchDts from "gen/js/fetch.d.ts!string";
Expand Down Expand Up @@ -59,6 +60,7 @@ export const assetSourceCode: { [key: string]: string } = {
"compiler.d.ts": compilerDts,
"console.d.ts": consoleDts,
"deno.d.ts": denoDts,
"libdeno.d.ts": libdenoDts,
"globals.d.ts": globalsDts,
"os.d.ts": osDts,
"fetch.d.ts": fetchDts,
Expand Down
4 changes: 3 additions & 1 deletion js/compiler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
import * as ts from "typescript";
import { assetSourceCode } from "./assets";
import * as deno from "./deno";
import { libdeno, window, globalEval } from "./globals";
import { globalEval } from "./global-eval";
import { libdeno } from "./libdeno";
import { window } from "./globals";
import * as os from "./os";
import { RawSourceMap } from "./types";
import { assert, log, notImplemented } from "./util";
Expand Down
2 changes: 1 addition & 1 deletion js/deno.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2018 the Deno authors. All rights reserved. MIT license.
// Public deno module.
export { exit, readFileSync, writeFileSync } from "./os";
export { libdeno } from "./globals";
export { libdeno } from "./libdeno";
2 changes: 1 addition & 1 deletion js/fetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
notImplemented
} from "./util";
import { flatbuffers } from "flatbuffers";
import { libdeno } from "./globals";
import { libdeno } from "./libdeno";
import { deno as fbs } from "gen/msg_generated";
import {
Headers,
Expand Down
6 changes: 6 additions & 0 deletions js/global-eval.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// If you use the eval function indirectly, by invoking it via a reference
// other than eval, as of ECMAScript 5 it works in the global scope rather than
// the local scope. This means, for instance, that function declarations create
// global functions, and that the code being evaluated doesn't have access to
// local variables within the scope where it's being called.
export const globalEval = eval;
22 changes: 3 additions & 19 deletions js/globals.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

import { Console } from "./console";
import { exit } from "./os";
import { RawSourceMap } from "./types";
import * as timers from "./timers";
import { TextEncoder, TextDecoder } from "./text_encoding";
import { TextDecoder, TextEncoder } from "./text_encoding";
import * as fetch_ from "./fetch";
import { libdeno } from "./libdeno";
import { globalEval } from "./global-eval";

declare global {
interface Window {
Expand Down Expand Up @@ -36,27 +37,10 @@ declare global {
// tslint:enable:variable-name
}

// If you use the eval function indirectly, by invoking it via a reference
// other than eval, as of ECMAScript 5 it works in the global scope rather than
// the local scope. This means, for instance, that function declarations create
// global functions, and that the code being evaluated doesn't have access to
// local variables within the scope where it's being called.
export const globalEval = eval;

// A reference to the global object.
export const window = globalEval("this");
window.window = window;

// The libdeno functions are moved so that users can't access them.
type MessageCallback = (msg: Uint8Array) => void;
interface Libdeno {
recv(cb: MessageCallback): void;
send(msg: ArrayBufferView): null | Uint8Array;
print(x: string): void;
mainSource: string;
mainSourceMap: RawSourceMap;
}
export const libdeno = window.libdeno as Libdeno;
window.libdeno = null;

// import "./url";
Expand Down
18 changes: 18 additions & 0 deletions js/libdeno.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { RawSourceMap } from "./types";
import { globalEval } from "./global-eval";

// The libdeno functions are moved so that users can't access them.
type MessageCallback = (msg: Uint8Array) => void;
interface Libdeno {
recv(cb: MessageCallback): void;

send(msg: ArrayBufferView): null | Uint8Array;

print(x: string): void;

mainSource: string;
mainSourceMap: RawSourceMap;
}

const window = globalEval("this");
export const libdeno = window.libdeno as Libdeno;
2 changes: 1 addition & 1 deletion js/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { deno as fbs } from "gen/msg_generated";
import { assert, assignCmdId, log, setLogDebug } from "./util";
import * as os from "./os";
import { DenoCompiler } from "./compiler";
import { libdeno } from "./globals";
import { libdeno } from "./libdeno";
import * as timers from "./timers";
import { onFetchRes } from "./fetch";

Expand Down
2 changes: 1 addition & 1 deletion js/os.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { assert } from "./util";
import * as util from "./util";
import { maybeThrowError } from "./errors";
import { flatbuffers } from "flatbuffers";
import { libdeno } from "./globals";
import { libdeno } from "./libdeno";

export function exit(exitCode = 0): never {
const builder = new flatbuffers.Builder();
Expand Down
2 changes: 1 addition & 1 deletion js/timers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { assert } from "./util";
import * as util from "./util";
import { deno as fbs } from "gen/msg_generated";
import { flatbuffers } from "flatbuffers";
import { libdeno } from "./globals";
import { libdeno } from "./libdeno";

let nextTimerId = 1;

Expand Down
5 changes: 4 additions & 1 deletion tslint.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,5 +63,8 @@
"allow-leading-underscore",
"allow-trailing-underscore"
]
}
},
"extends": [
"tslint-no-circular-imports"
]
}

0 comments on commit 84c38f3

Please sign in to comment.