summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--cli/flags.rs37
-rw-r--r--js/unit_tests.ts2
-rwxr-xr-xtools/build_website.py8
-rwxr-xr-xtools/upload_website.py6
-rw-r--r--website/app.ts (renamed from website/app.js)27
-rw-r--r--website/app_test.ts (renamed from website/app_test.js)5
-rw-r--r--website/benchmarks.html30
-rw-r--r--website/manual.md66
9 files changed, 126 insertions, 56 deletions
diff --git a/.gitignore b/.gitignore
index 0dd8e57e4..5c16b784d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,4 +15,5 @@ node_modules
# temp benchmark data
/website/data.json
/website/recent.json
+/website/*.bundle.js
/js/gen
diff --git a/cli/flags.rs b/cli/flags.rs
index fa86df594..41d3f9308 100644
--- a/cli/flags.rs
+++ b/cli/flags.rs
@@ -186,11 +186,14 @@ compiler.",
.setting(AppSettings::DisableVersion)
.about("Bundle module and dependencies into single file")
.long_about(
- "Fetch, compile, and output to a single file a module and its dependencies.
-"
+ "Output a single JavaScript file with all dependencies
+
+Example:
+
+ deno bundle https://deno.land/std/examples/colors.ts"
)
.arg(Arg::with_name("source_file").takes_value(true).required(true))
- .arg(Arg::with_name("out_file").takes_value(true).required(true)),
+ .arg(Arg::with_name("out_file").takes_value(true).required(false)),
).subcommand(
SubCommand::with_name("fetch")
.setting(AppSettings::DisableVersion)
@@ -498,6 +501,29 @@ pub enum DenoSubcommand {
Xeval,
}
+fn get_default_bundle_filename(source_file: &str) -> String {
+ use crate::worker::root_specifier_to_url;
+ let url = root_specifier_to_url(source_file).unwrap();
+ let path_segments = url.path_segments().unwrap();
+ let last = path_segments.last().unwrap();
+ String::from(last.trim_end_matches(".ts").trim_end_matches(".js"))
+ + ".bundle.js"
+}
+
+#[test]
+fn test_get_default_bundle_filename() {
+ assert_eq!(get_default_bundle_filename("blah.ts"), "blah.bundle.js");
+ assert_eq!(
+ get_default_bundle_filename("http://example.com/blah.ts"),
+ "blah.bundle.js"
+ );
+ assert_eq!(get_default_bundle_filename("blah.js"), "blah.bundle.js");
+ assert_eq!(
+ get_default_bundle_filename("http://example.com/blah.js"),
+ "blah.bundle.js"
+ );
+}
+
pub fn flags_from_vec(
args: Vec<String>,
) -> (DenoFlags, DenoSubcommand, Vec<String>) {
@@ -510,7 +536,10 @@ pub fn flags_from_vec(
("bundle", Some(bundle_match)) => {
flags.allow_write = true;
let source_file: &str = bundle_match.value_of("source_file").unwrap();
- let out_file: &str = bundle_match.value_of("out_file").unwrap();
+ let out_file = bundle_match
+ .value_of("out_file")
+ .map(String::from)
+ .unwrap_or_else(|| get_default_bundle_filename(source_file));
argv.extend(vec![source_file.to_string(), out_file.to_string()]);
DenoSubcommand::Bundle
}
diff --git a/js/unit_tests.ts b/js/unit_tests.ts
index eb6f62bdb..ff9f459e5 100644
--- a/js/unit_tests.ts
+++ b/js/unit_tests.ts
@@ -50,7 +50,7 @@ import "./performance_test.ts";
import "./permissions_test.ts";
import "./version_test.ts";
-import "../website/app_test.js";
+import "../website/app_test.ts";
import { runIfMain } from "./deps/https/deno.land/std/testing/mod.ts";
diff --git a/tools/build_website.py b/tools/build_website.py
new file mode 100755
index 000000000..b519f3853
--- /dev/null
+++ b/tools/build_website.py
@@ -0,0 +1,8 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import os
+from util import run, root_path, build_path
+
+os.chdir(os.path.join(root_path, "website"))
+deno_exe = os.path.join(build_path(), "deno")
+run([deno_exe, "bundle", "app.ts", "app.bundle.js"])
diff --git a/tools/upload_website.py b/tools/upload_website.py
index 0f9ce9164..e1d100f99 100755
--- a/tools/upload_website.py
+++ b/tools/upload_website.py
@@ -1,14 +1,18 @@
#!/usr/bin/env python
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import os
+import sys
import tempfile
-from util import run, root_path
+from util import run, root_path, build_path
# Probably run tools/docs.py first.
# AWS CLI must be installed separately.
os.chdir(os.path.join(root_path, "website"))
+deno_exe = os.path.join(build_path(), "deno")
+run([sys.executable, "../tools/build_website.py"])
+
# Invalidate the cache.
run([
"aws", "cloudfront", "create-invalidation", "--distribution-id",
diff --git a/website/app.js b/website/app.ts
index 9f16e8e45..dfc299d2b 100644
--- a/website/app.js
+++ b/website/app.ts
@@ -139,7 +139,8 @@ function generate(
const yAxis = {
padding: { bottom: 0 },
min: 0,
- label: yLabel
+ label: yLabel,
+ tick: null
};
if (yTickFormat) {
yAxis.tick = {
@@ -272,3 +273,27 @@ export async function drawChartsFromBenchmarkData(dataUrl) {
gen("#thread-count-chart", threadCountColumns, "threads");
gen("#syscall-count-chart", syscallCountColumns, "syscalls");
}
+
+export function main(): void {
+ window["chartWidth"] = 800;
+ const overlay = window["document"].getElementById("spinner-overlay");
+
+ function showSpinner() {
+ overlay.style.display = "block";
+ }
+
+ function hideSpinner() {
+ overlay.style.display = "none";
+ }
+
+ function updateCharts() {
+ const u = window.location.hash.match("all") ? "./data.json" : "recent.json";
+
+ showSpinner();
+
+ drawCharts(u).finally(hideSpinner);
+ }
+ updateCharts();
+
+ window["onhashchange"] = updateCharts;
+}
diff --git a/website/app_test.js b/website/app_test.ts
index b6845a0f7..c16487585 100644
--- a/website/app_test.js
+++ b/website/app_test.ts
@@ -1,13 +1,14 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import { test, testPerm, assert, assertEquals } from "../js/test_util.ts";
+import { runIfMain } from "../js/deps/https/deno.land/std/testing/mod.ts";
import {
createBinarySizeColumns,
createExecTimeColumns,
createThreadCountColumns,
createSyscallCountColumns,
createSha1List
-} from "./app.js";
+} from "./app.ts";
const regularData = [
{
@@ -191,3 +192,5 @@ test(function createSha1ListRegularData() {
const sha1List = createSha1List(regularData);
assertEquals(sha1List, ["abcdef", "012345"]);
});
+
+runIfMain(import.meta);
diff --git a/website/benchmarks.html b/website/benchmarks.html
index fa1b140e9..fd68faee2 100644
--- a/website/benchmarks.html
+++ b/website/benchmarks.html
@@ -230,31 +230,11 @@
<script src="https://unpkg.com/d3@5.7.0/dist/d3.min.js"></script>
<script src="https://unpkg.com/c3@0.6.7/c3.min.js"></script>
- <script type="module">
- import { drawCharts } from "./app.js";
- window.chartWidth = 800;
- const overlay = document.getElementById("spinner-overlay");
-
- function showSpinner() {
- overlay.style.display = "block";
- }
-
- function hideSpinner() {
- overlay.style.display = "none";
- }
-
- function updateCharts() {
- const u = window.location.hash.match("all")
- ? "./data.json"
- : "recent.json";
-
- showSpinner();
-
- drawCharts(u).finally(hideSpinner);
- }
- updateCharts();
-
- window.onhashchange = updateCharts;
+ <!-- Run "deno bundle app.ts" to generate app.bundle.js -->
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js"></script>
+ <script src="app.bundle.js"></script>
+ <script>
+ requirejs(['app'], (app) => app.main());
</script>
</body>
</html>
diff --git a/website/manual.md b/website/manual.md
index 8b3d37521..1810cdc7a 100644
--- a/website/manual.md
+++ b/website/manual.md
@@ -591,30 +591,9 @@ if (import.meta.main) {
### Flags
-```shellsession
-deno
-A secure runtime for JavaScript and TypeScript built with V8, Rust, and Tokio.
-
-Docs: https://deno.land/manual.html
-Modules: https://github.com/denoland/deno_std
-Bugs: https://github.com/denoland/deno/issues
-
-To run the REPL:
-
- deno
-
-To execute a sandboxed script:
-
- deno https://deno.land/welcome.ts
-
-To evaluate code from the command line:
-
- deno eval "console.log(30933 + 404)"
-
-To get help on the another subcommands (run in this case):
-
- deno help run
+Use `deno help` to see the help text.
+```
USAGE:
deno [FLAGS] [OPTIONS] [SUBCOMMAND]
@@ -640,6 +619,7 @@ OPTIONS:
SUBCOMMANDS:
<script> Script to run
+ bundle Bundle module and dependnecies into single file
eval Eval script
fetch Fetch the dependencies
fmt Format files
@@ -678,6 +658,46 @@ Particularly useful ones:
--async-stack-trace
```
+### Bundling
+
+`deno bundle [URL]` will output a single JavaScript file, using
+[AMD](https://en.wikipedia.org/wiki/Asynchronous_module_definition), which
+includes all dependencies of the specified input.
+
+```
+> deno bundle https://deno.land/std/examples/colors.ts
+Bundling "colors.bundle.js"
+Emitting bundle to "colors.bundle.js"
+9.2 kB emitted.
+```
+
+To run then bundle in Deno use
+
+```
+deno https://deno.land/std/bundle/run.ts colors.bundle.js
+```
+
+Bundles can also be loaded in the web browser with the assistance of
+[RequireJS](https://requirejs.org/). Suppose we have a bundle called
+`website.bundle.js`, then the following HTML should be able to load it:
+
+```html
+<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js"></script>
+<script src="website.bundle.js"></script>
+<script>
+ requirejs(["website"], website => website.main());
+</script>
+```
+
+Here we assume there's an exported function `main()` from `website.ts`.
+
+```js
+// website.ts
+export main() {
+ console.log("hello from the web browser");
+}
+```
+
## Import maps
Deno supports [import maps](https://github.com/WICG/import-maps).