summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rw-r--r--js/compiler.ts36
-rw-r--r--js/os.ts68
2 files changed, 42 insertions, 62 deletions
diff --git a/js/compiler.ts b/js/compiler.ts
index 4ffef30fc..27b97dd2d 100644
--- a/js/compiler.ts
+++ b/js/compiler.ts
@@ -55,8 +55,7 @@ interface CompilerLookup {
* easily mocked.
*/
interface Os {
- codeCache: typeof os.codeCache;
- codeFetch: typeof os.codeFetch;
+ fetchModuleMetaData: typeof os.fetchModuleMetaData;
exit: typeof os.exit;
}
@@ -251,7 +250,10 @@ class Compiler implements ts.LanguageServiceHost, ts.FormatDiagnosticsHost {
} else {
// We query Rust with a CodeFetch message. It will load the sourceCode,
// and if there is any outputCode cached, will return that as well.
- const fetchResponse = this._os.codeFetch(moduleSpecifier, containingFile);
+ const fetchResponse = this._os.fetchModuleMetaData(
+ moduleSpecifier,
+ containingFile
+ );
moduleId = fetchResponse.moduleName;
fileName = fetchResponse.filename;
mediaType = fetchResponse.mediaType;
@@ -307,22 +309,26 @@ class Compiler implements ts.LanguageServiceHost, ts.FormatDiagnosticsHost {
// Deno specific compiler API
- /** Retrieve the output of the TypeScript compiler for a given module and
- * cache the result.
+ /** Retrieve the output of the TypeScript compiler for a given module.
*/
compile(
moduleSpecifier: ModuleSpecifier,
containingFile: ContainingFile
- ): ModuleMetaData {
+ ): { outputCode: OutputCode; sourceMap: SourceMap } {
this._log("compiler.compile", { moduleSpecifier, containingFile });
const moduleMetaData = this._resolveModule(moduleSpecifier, containingFile);
const { fileName, mediaType, moduleId, sourceCode } = moduleMetaData;
this._scriptFileNames = [fileName];
console.warn("Compiling", moduleId);
+ let outputCode: string;
+ let sourceMap = "";
// Instead of using TypeScript to transpile JSON modules, we will just do
// it directly.
if (mediaType === msg.MediaType.Json) {
- moduleMetaData.outputCode = jsonEsmTemplate(sourceCode, fileName);
+ outputCode = moduleMetaData.outputCode = jsonEsmTemplate(
+ sourceCode,
+ fileName
+ );
} else {
const service = this._service;
assert(
@@ -373,20 +379,14 @@ class Compiler implements ts.LanguageServiceHost, ts.FormatDiagnosticsHost {
outputFile.name.endsWith(".js"),
"Expected second emitted file to be JavaScript"
);
- moduleMetaData.outputCode = `${
+ outputCode = moduleMetaData.outputCode = `${
outputFile.text
}\n//# sourceURL=${fileName}`;
- moduleMetaData.sourceMap = sourceMapFile.text;
+ sourceMap = moduleMetaData.sourceMap = sourceMapFile.text;
}
moduleMetaData.scriptVersion = "1";
- this._os.codeCache(
- fileName,
- sourceCode,
- moduleMetaData.outputCode,
- moduleMetaData.sourceMap
- );
- return moduleMetaData;
+ return { outputCode, sourceMap };
}
// TypeScript Language Service and Format Diagnostic Host API
@@ -532,9 +532,9 @@ window.compilerMain = function compilerMain() {
const json = decoder.decode(data);
const { specifier, referrer } = JSON.parse(json) as CompilerLookup;
- const moduleMetaData = compiler.compile(specifier, referrer);
+ const result = compiler.compile(specifier, referrer);
- const responseJson = JSON.stringify(moduleMetaData);
+ const responseJson = JSON.stringify(result);
const response = encoder.encode(responseJson);
postMessage(response);
};
diff --git a/js/os.ts b/js/os.ts
index fbcb23a7f..03bb7bb42 100644
--- a/js/os.ts
+++ b/js/os.ts
@@ -3,6 +3,7 @@ import * as msg from "gen/msg_generated";
import { handleAsyncMsgFromRust, sendSync } from "./dispatch";
import * as flatbuffers from "./flatbuffers";
import { libdeno } from "./libdeno";
+import { TextDecoder } from "./text_encoding";
import { assert } from "./util";
import * as util from "./util";
@@ -27,7 +28,7 @@ export function setGlobals(
execPath = execPath_;
}
-interface CodeInfo {
+interface ResponseModuleMetaData {
moduleName: string | undefined;
filename: string | undefined;
mediaType: msg.MediaType;
@@ -60,63 +61,42 @@ export function exit(exitCode = 0): never {
return util.unreachable();
}
+const decoder = new TextDecoder();
+
// @internal
-export function codeFetch(specifier: string, referrer: string): CodeInfo {
- util.log("os.codeFetch", { specifier, referrer });
- // Send CodeFetch message
+export function fetchModuleMetaData(
+ specifier: string,
+ referrer: string
+): ResponseModuleMetaData {
+ util.log("os.fetchModuleMetaData", { specifier, referrer });
+ // Send FetchModuleMetaData message
const builder = flatbuffers.createBuilder();
const specifier_ = builder.createString(specifier);
const referrer_ = builder.createString(referrer);
- msg.CodeFetch.startCodeFetch(builder);
- msg.CodeFetch.addSpecifier(builder, specifier_);
- msg.CodeFetch.addReferrer(builder, referrer_);
- const inner = msg.CodeFetch.endCodeFetch(builder);
- const baseRes = sendSync(builder, msg.Any.CodeFetch, inner);
+ msg.FetchModuleMetaData.startFetchModuleMetaData(builder);
+ msg.FetchModuleMetaData.addSpecifier(builder, specifier_);
+ msg.FetchModuleMetaData.addReferrer(builder, referrer_);
+ const inner = msg.FetchModuleMetaData.endFetchModuleMetaData(builder);
+ const baseRes = sendSync(builder, msg.Any.FetchModuleMetaData, inner);
assert(baseRes != null);
assert(
- msg.Any.CodeFetchRes === baseRes!.innerType(),
+ msg.Any.FetchModuleMetaDataRes === baseRes!.innerType(),
`base.innerType() unexpectedly is ${baseRes!.innerType()}`
);
- const codeFetchRes = new msg.CodeFetchRes();
- assert(baseRes!.inner(codeFetchRes) != null);
+ const fetchModuleMetaDataRes = new msg.FetchModuleMetaDataRes();
+ assert(baseRes!.inner(fetchModuleMetaDataRes) != null);
+ const dataArray = fetchModuleMetaDataRes.dataArray();
+ const sourceCode = dataArray ? decoder.decode(dataArray) : undefined;
// flatbuffers returns `null` for an empty value, this does not fit well with
// idiomatic TypeScript under strict null checks, so converting to `undefined`
return {
- moduleName: codeFetchRes.moduleName() || undefined,
- filename: codeFetchRes.filename() || undefined,
- mediaType: codeFetchRes.mediaType(),
- sourceCode: codeFetchRes.sourceCode() || undefined
+ moduleName: fetchModuleMetaDataRes.moduleName() || undefined,
+ filename: fetchModuleMetaDataRes.filename() || undefined,
+ mediaType: fetchModuleMetaDataRes.mediaType(),
+ sourceCode
};
}
-// @internal
-export function codeCache(
- filename: string,
- sourceCode: string,
- outputCode: string,
- sourceMap: string
-): void {
- util.log("os.codeCache", {
- filename,
- sourceCodeLength: sourceCode.length,
- outputCodeLength: outputCode.length,
- sourceMapLength: sourceMap.length
- });
- const builder = flatbuffers.createBuilder();
- const filename_ = builder.createString(filename);
- const sourceCode_ = builder.createString(sourceCode);
- const outputCode_ = builder.createString(outputCode);
- const sourceMap_ = builder.createString(sourceMap);
- msg.CodeCache.startCodeCache(builder);
- msg.CodeCache.addFilename(builder, filename_);
- msg.CodeCache.addSourceCode(builder, sourceCode_);
- msg.CodeCache.addOutputCode(builder, outputCode_);
- msg.CodeCache.addSourceMap(builder, sourceMap_);
- const inner = msg.CodeCache.endCodeCache(builder);
- const baseRes = sendSync(builder, msg.Any.CodeCache, inner);
- assert(baseRes == null); // Expect null or error.
-}
-
function createEnv(inner: msg.EnvironRes): { [index: string]: string } {
const env: { [index: string]: string } = {};