From 41215eb29c50cdf7048f7431076ccc986b514f6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Fri, 7 Aug 2020 16:55:02 +0200 Subject: Op crate for Web APIs (#6906) Co-authored-by: Ryan Dahl --- cli/Cargo.toml | 1 + cli/build.rs | 75 ++- cli/dts/lib.deno.shared_globals.d.ts | 184 +----- cli/js.rs | 1 + cli/main.rs | 3 +- cli/rt/00_dom_exception.js | 15 - cli/rt/01_event.js | 1044 ---------------------------------- cli/rt/07_base64.js | 157 ----- cli/rt/08_text_encoding.js | 686 ---------------------- cli/tests/performance_stats.out | 2 +- cli/tsc/99_main_compiler.js | 5 + 11 files changed, 85 insertions(+), 2088 deletions(-) delete mode 100644 cli/rt/00_dom_exception.js delete mode 100644 cli/rt/01_event.js delete mode 100644 cli/rt/07_base64.js delete mode 100644 cli/rt/08_text_encoding.js (limited to 'cli') diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 8a8958b63..bedbdb657 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -16,6 +16,7 @@ path = "main.rs" [build-dependencies] deno_core = { path = "../core", version = "0.51.0" } +deno_web = { path = "../op_crates/web", version = "0.1.0" } [target.'cfg(windows)'.build-dependencies] winres = "0.1" diff --git a/cli/build.rs b/cli/build.rs index 777e74558..5a7f173e5 100644 --- a/cli/build.rs +++ b/cli/build.rs @@ -38,6 +38,11 @@ fn create_compiler_snapshot( ) { let mut runtime_isolate = CoreIsolate::new(StartupData::None, true); let mut custom_libs: HashMap = HashMap::new(); + let web_scripts = deno_web::get_scripts(); + custom_libs.insert( + "lib.deno.web.d.ts".to_string(), + PathBuf::from(web_scripts.declaration), + ); custom_libs.insert( "lib.deno.window.d.ts".to_string(), cwd.join("dts/lib.deno.window.d.ts"), @@ -80,6 +85,10 @@ fn main() { // op_fetch_asset::trace_serializer(); println!("cargo:rustc-env=TS_VERSION={}", ts_version()); + println!( + "cargo:rustc-env=DENO_WEB_LIB_PATH={}", + deno_web::get_scripts().declaration + ); println!( "cargo:rustc-env=TARGET={}", @@ -93,7 +102,7 @@ fn main() { let runtime_snapshot_path = o.join("CLI_SNAPSHOT.bin"); let compiler_snapshot_path = o.join("COMPILER_SNAPSHOT.bin"); - let js_files = get_js_files("rt"); + let js_files = get_js_files_for_rt(); create_runtime_snapshot(&runtime_snapshot_path, js_files); let js_files = get_js_files("tsc"); @@ -123,3 +132,67 @@ fn get_js_files(d: &str) -> Vec { js_files.sort(); js_files } + +fn get_js_files_for_rt() -> Vec { + let web_scripts = deno_web::get_scripts(); + + let f = vec![ + "rt/00_bootstrap_namespace.js", + &web_scripts.dom_exception, + "rt/01_build.js", + "rt/01_colors.js", + "rt/01_errors.js", + &web_scripts.event, + "rt/01_internals.js", + "rt/01_version.js", + "rt/01_web_util.js", + "rt/02_abort_signal.js", + "rt/02_console.js", + "rt/03_dom_iterable.js", + "rt/06_util.js", + &web_scripts.text_encoding, + "rt/10_dispatch_json.js", + "rt/10_dispatch_minimal.js", + "rt/11_crypto.js", + "rt/11_resources.js", + "rt/11_streams.js", + "rt/11_timers.js", + "rt/11_url.js", + "rt/11_workers.js", + "rt/12_io.js", + "rt/13_buffer.js", + "rt/20_blob.js", + "rt/20_headers.js", + "rt/20_streams_queuing_strategy.js", + "rt/21_dom_file.js", + "rt/22_form_data.js", + "rt/23_multipart.js", + "rt/24_body.js", + "rt/25_request.js", + "rt/26_fetch.js", + "rt/30_files.js", + "rt/30_fs.js", + "rt/30_metrics.js", + "rt/30_net.js", + "rt/30_os.js", + "rt/40_compiler_api.js", + "rt/40_diagnostics.js", + "rt/40_error_stack.js", + "rt/40_fs_events.js", + "rt/40_net_unstable.js", + "rt/40_performance.js", + "rt/40_permissions.js", + "rt/40_plugins.js", + "rt/40_process.js", + "rt/40_read_file.js", + "rt/40_repl.js", + "rt/40_signals.js", + "rt/40_testing.js", + "rt/40_tls.js", + "rt/40_tty.js", + "rt/40_write_file.js", + "rt/90_deno_ns.js", + "rt/99_main.js", + ]; + f.iter().map(|p| p.to_string()).collect() +} diff --git a/cli/dts/lib.deno.shared_globals.d.ts b/cli/dts/lib.deno.shared_globals.d.ts index e331baee1..ec5367962 100644 --- a/cli/dts/lib.deno.shared_globals.d.ts +++ b/cli/dts/lib.deno.shared_globals.d.ts @@ -4,6 +4,7 @@ /// /// +/// // This follows the WebIDL at: https://webassembly.github.io/spec/js-api/ // and: https://webassembly.github.io/spec/web-api/ @@ -529,12 +530,6 @@ interface DOMStringList { [index: number]: string; } -declare class DOMException extends Error { - constructor(message?: string, name?: string); - readonly name: string; - readonly message: string; -} - type BufferSource = ArrayBufferView | ArrayBuffer; type BlobPart = BufferSource | Blob | string; @@ -1030,46 +1025,6 @@ declare function fetch( init?: RequestInit, ): Promise; -/** Decodes a string of data which has been encoded using base-64 encoding. - * - * console.log(atob("aGVsbG8gd29ybGQ=")); // outputs 'hello world' - */ -declare function atob(s: string): string; - -/** Creates a base-64 ASCII encoded string from the input string. - * - * console.log(btoa("hello world")); // outputs "aGVsbG8gd29ybGQ=" - */ -declare function btoa(s: string): string; - -declare class TextDecoder { - /** Returns encoding's name, lowercased. */ - readonly encoding: string; - /** Returns `true` if error mode is "fatal", and `false` otherwise. */ - readonly fatal: boolean; - /** Returns `true` if ignore BOM flag is set, and `false` otherwise. */ - readonly ignoreBOM = false; - constructor( - label?: string, - options?: { fatal?: boolean; ignoreBOM?: boolean }, - ); - /** Returns the result of running encoding's decoder. */ - decode(input?: BufferSource, options?: { stream?: false }): string; - readonly [Symbol.toStringTag]: string; -} - -declare class TextEncoder { - /** Returns "utf-8". */ - readonly encoding = "utf-8"; - /** Returns the result of running UTF-8's encoder. */ - encode(input?: string): Uint8Array; - encodeInto( - input: string, - dest: Uint8Array, - ): { read: number; written: number }; - readonly [Symbol.toStringTag]: string; -} - interface URLSearchParams { /** Appends a specified key/value pair as a new search parameter. * @@ -1444,143 +1399,6 @@ declare class PerformanceMeasure extends PerformanceEntry { readonly entryType: "measure"; } -interface EventInit { - bubbles?: boolean; - cancelable?: boolean; - composed?: boolean; -} - -/** An event which takes place in the DOM. */ -declare class Event { - constructor(type: string, eventInitDict?: EventInit); - /** Returns true or false depending on how event was initialized. True if - * event goes through its target's ancestors in reverse tree order, and - * false otherwise. */ - readonly bubbles: boolean; - cancelBubble: boolean; - /** Returns true or false depending on how event was initialized. Its return - * value does not always carry meaning, but true can indicate that part of the - * operation during which event was dispatched, can be canceled by invoking - * the preventDefault() method. */ - readonly cancelable: boolean; - /** Returns true or false depending on how event was initialized. True if - * event invokes listeners past a ShadowRoot node that is the root of its - * target, and false otherwise. */ - readonly composed: boolean; - /** Returns the object whose event listener's callback is currently being - * invoked. */ - readonly currentTarget: EventTarget | null; - /** Returns true if preventDefault() was invoked successfully to indicate - * cancellation, and false otherwise. */ - readonly defaultPrevented: boolean; - /** Returns the event's phase, which is one of NONE, CAPTURING_PHASE, - * AT_TARGET, and BUBBLING_PHASE. */ - readonly eventPhase: number; - /** Returns true if event was dispatched by the user agent, and false - * otherwise. */ - readonly isTrusted: boolean; - /** Returns the object to which event is dispatched (its target). */ - readonly target: EventTarget | null; - /** Returns the event's timestamp as the number of milliseconds measured - * relative to the time origin. */ - readonly timeStamp: number; - /** Returns the type of event, e.g. "click", "hashchange", or "submit". */ - readonly type: string; - /** Returns the invocation target objects of event's path (objects on which - * listeners will be invoked), except for any nodes in shadow trees of which - * the shadow root's mode is "closed" that are not reachable from event's - * currentTarget. */ - composedPath(): EventTarget[]; - /** If invoked when the cancelable attribute value is true, and while - * executing a listener for the event with passive set to false, signals to - * the operation that caused event to be dispatched that it needs to be - * canceled. */ - preventDefault(): void; - /** Invoking this method prevents event from reaching any registered event - * listeners after the current one finishes running and, when dispatched in a - * tree, also prevents event from reaching any other objects. */ - stopImmediatePropagation(): void; - /** When dispatched in a tree, invoking this method prevents event from - * reaching any objects other than the current object. */ - stopPropagation(): void; - readonly AT_TARGET: number; - readonly BUBBLING_PHASE: number; - readonly CAPTURING_PHASE: number; - readonly NONE: number; - static readonly AT_TARGET: number; - static readonly BUBBLING_PHASE: number; - static readonly CAPTURING_PHASE: number; - static readonly NONE: number; -} - -/** - * EventTarget is a DOM interface implemented by objects that can receive events - * and may have listeners for them. - */ -declare class EventTarget { - /** Appends an event listener for events whose type attribute value is type. - * The callback argument sets the callback that will be invoked when the event - * is dispatched. - * - * The options argument sets listener-specific options. For compatibility this - * can be a boolean, in which case the method behaves exactly as if the value - * was specified as options's capture. - * - * When set to true, options's capture prevents callback from being invoked - * when the event's eventPhase attribute value is BUBBLING_PHASE. When false - * (or not present), callback will not be invoked when event's eventPhase - * attribute value is CAPTURING_PHASE. Either way, callback will be invoked if - * event's eventPhase attribute value is AT_TARGET. - * - * When set to true, options's passive indicates that the callback will not - * cancel the event by invoking preventDefault(). This is used to enable - * performance optimizations described in ยง 2.8 Observing event listeners. - * - * When set to true, options's once indicates that the callback will only be - * invoked once after which the event listener will be removed. - * - * The event listener is appended to target's event listener list and is not - * appended if it has the same type, callback, and capture. */ - addEventListener( - type: string, - listener: EventListenerOrEventListenerObject | null, - options?: boolean | AddEventListenerOptions, - ): void; - /** Dispatches a synthetic event event to target and returns true if either - * event's cancelable attribute value is false or its preventDefault() method - * was not invoked, and false otherwise. */ - dispatchEvent(event: Event): boolean; - /** Removes the event listener in target's event listener list with the same - * type, callback, and options. */ - removeEventListener( - type: string, - callback: EventListenerOrEventListenerObject | null, - options?: EventListenerOptions | boolean, - ): void; - [Symbol.toStringTag]: string; -} - -interface EventListener { - (evt: Event): void | Promise; -} - -interface EventListenerObject { - handleEvent(evt: Event): void | Promise; -} - -declare type EventListenerOrEventListenerObject = - | EventListener - | EventListenerObject; - -interface AddEventListenerOptions extends EventListenerOptions { - once?: boolean; - passive?: boolean; -} - -interface EventListenerOptions { - capture?: boolean; -} - /** Events measuring progress of an underlying process, like an HTTP request * (for an XMLHttpRequest, or the loading of the underlying resource of an * ,