From 151ce0266eb4de2c8fc600c81c192a5f791b6169 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Wed, 9 Oct 2019 17:10:09 -0400 Subject: Move everything into std subdir --- std/bundle/utils.ts | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 std/bundle/utils.ts (limited to 'std/bundle/utils.ts') diff --git a/std/bundle/utils.ts b/std/bundle/utils.ts new file mode 100644 index 000000000..91c0820bf --- /dev/null +++ b/std/bundle/utils.ts @@ -0,0 +1,107 @@ +// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. + +import { assert } from "../testing/asserts.ts"; +import { exists } from "../fs/exists.ts"; + +export interface DefineFactory { + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + (...args: any): object | void; +} + +export interface ModuleMetaData { + dependencies: string[]; + factory?: DefineFactory | object; + exports: object; +} + +type Define = ( + id: string, + dependencies: string[], + factory: DefineFactory +) => void; + +/* eslint-disable @typescript-eslint/no-namespace */ +declare global { + namespace globalThis { + // eslint-disable-next-line no-var + var define: Define | undefined; + } +} +/* eslint-enable @typescript-eslint/no-namespace */ + +/** Evaluate the bundle, returning a queue of module IDs and their data to + * instantiate. + */ +export function evaluate( + text: string +): [string[], Map] { + const queue: string[] = []; + const modules = new Map(); + + globalThis.define = function define( + id: string, + dependencies: string[], + factory: DefineFactory + ): void { + modules.set(id, { + dependencies, + factory, + exports: {} + }); + queue.push(id); + }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (Deno as any).core.evalContext(text); + // Deleting `define()` so it isn't accidentally there when the modules + // instantiate. + delete globalThis.define; + + return [queue, modules]; +} + +/** Drain the queue of module IDs while instantiating the modules. */ +export function instantiate( + queue: string[], + modules: Map +): void { + let id: string | undefined; + while ((id = queue.shift())) { + const module = modules.get(id)!; + assert(module != null); + assert(module.factory != null); + + const dependencies = module.dependencies.map((id): object => { + if (id === "require") { + // TODO(kitsonk) support dynamic import by passing a `require()` that + // can return a local module or dynamically import one. + return (): void => {}; + } else if (id === "exports") { + return module.exports; + } + const dep = modules.get(id)!; + assert(dep != null); + return dep.exports; + }); + + if (typeof module.factory === "function") { + module.factory!(...dependencies); + } else if (module.factory) { + // when bundling JSON, TypeScript just emits it as an object/array as the + // third argument of the `define()`. + module.exports = module.factory; + } + delete module.factory; + } +} + +/** Load the bundle and return the contents asynchronously. */ +export async function load(args: string[]): Promise { + // TODO(kitsonk) allow loading of remote bundles via fetch. + assert(args.length >= 2, "Expected at least two arguments."); + const [, bundleFileName] = args; + assert( + await exists(bundleFileName), + `Expected "${bundleFileName}" to exist.` + ); + return new TextDecoder().decode(await Deno.readFile(bundleFileName)); +} -- cgit v1.2.3 From 93f7f00c956c14620ef031626f124b57397ca867 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Wed, 9 Oct 2019 17:22:22 -0400 Subject: Run deno_std tests in github actions --- std/bundle/utils.ts | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'std/bundle/utils.ts') diff --git a/std/bundle/utils.ts b/std/bundle/utils.ts index 91c0820bf..062c62231 100644 --- a/std/bundle/utils.ts +++ b/std/bundle/utils.ts @@ -70,18 +70,20 @@ export function instantiate( assert(module != null); assert(module.factory != null); - const dependencies = module.dependencies.map((id): object => { - if (id === "require") { - // TODO(kitsonk) support dynamic import by passing a `require()` that - // can return a local module or dynamically import one. - return (): void => {}; - } else if (id === "exports") { - return module.exports; + const dependencies = module.dependencies.map( + (id): object => { + if (id === "require") { + // TODO(kitsonk) support dynamic import by passing a `require()` that + // can return a local module or dynamically import one. + return (): void => {}; + } else if (id === "exports") { + return module.exports; + } + const dep = modules.get(id)!; + assert(dep != null); + return dep.exports; } - const dep = modules.get(id)!; - assert(dep != null); - return dep.exports; - }); + ); if (typeof module.factory === "function") { module.factory!(...dependencies); -- cgit v1.2.3