diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index fc5b57536fd..319ac73a175 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -3,7 +3,7 @@ FROM node:17.9.0-buster ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=1.59.0 + RUST_VERSION=1.61.0 RUN set -eux; \ dpkgArch="$(dpkg --print-architecture)"; \ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d34cddf61e3..041c4351a0a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -143,8 +143,6 @@ jobs: uses: actions-rs/toolchain@v1 with: profile: minimal - override: true - toolchain: 1.59.0 target: wasm32-unknown-unknown - name: Cache cargo dependencies @@ -229,8 +227,6 @@ jobs: uses: actions-rs/toolchain@v1 with: profile: minimal - override: true - toolchain: 1.59.0 target: ${{ matrix.settings.target }} - name: Pull Latest Image @@ -505,9 +501,8 @@ jobs: if: ${{ needs.changes.outputs.fullbuild == 'true' }} uses: actions-rs/toolchain@v1 with: - toolchain: 1.59.0 - profile: default - override: true + profile: minimal + components: rustfmt, clippy - name: Cache cargo dependencies if: ${{ needs.changes.outputs.fullbuild == 'true' }} diff --git a/Cargo.lock b/Cargo.lock index 04a9b0bee1b..2f125ca73c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -125,33 +125,26 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "3.0.0-beta.5" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feff3878564edb93745d58cf63e17b63f24142506e7a20c87a5521ed7bfb1d63" +checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", "bitflags", - "clap_derive", + "clap_lex", "indexmap", - "lazy_static", - "os_str_bytes", "strsim 0.10.0", "termcolor", "textwrap", - "unicase", ] [[package]] -name = "clap_derive" -version = "3.0.0-beta.5" +name = "clap_lex" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b15c6b4f786ffb6192ffe65a36855bc1fc2444bcd0945ae16748dcd6ed7d0d3" +checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", + "os_str_bytes", ] [[package]] @@ -391,15 +384,6 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "hermit-abi" version = "0.1.19" @@ -713,12 +697,9 @@ checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" [[package]] name = "os_str_bytes" -version = "4.2.0" +version = "6.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addaa943333a514159c80c97ff4a93306530d965d27e139188283cd13e06a799" -dependencies = [ - "memchr", -] +checksum = "029d8d0b2f198229de29dca79676f2738ff952edf3fde542eb8bf94d8c21b435" [[package]] name = "parking_lot" @@ -858,30 +839,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro-hack" version = "0.5.19" @@ -1720,12 +1677,9 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.14.2" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80" -dependencies = [ - "unicode-width", -] +checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" [[package]] name = "tinyvec" @@ -1786,15 +1740,6 @@ version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-bidi" version = "0.3.7" @@ -1816,12 +1761,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" - [[package]] name = "unicode-width" version = "0.1.9" diff --git a/packages/qwik/src/optimizer/cli/Cargo.toml b/packages/qwik/src/optimizer/cli/Cargo.toml index 7ed6f130562..50888cc2910 100644 --- a/packages/qwik/src/optimizer/cli/Cargo.toml +++ b/packages/qwik/src/optimizer/cli/Cargo.toml @@ -6,6 +6,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = "3.0.0-beta.5" +clap = "3.1.8" qwik-core = { path = "../core", features = ["fs", "parallel"] } path-absolutize = "3.0.11" \ No newline at end of file diff --git a/packages/qwik/src/optimizer/cli/src/main.rs b/packages/qwik/src/optimizer/cli/src/main.rs index 59d036f9328..b185c6dbcf7 100644 --- a/packages/qwik/src/optimizer/cli/src/main.rs +++ b/packages/qwik/src/optimizer/cli/src/main.rs @@ -4,12 +4,13 @@ use std::path::PathBuf; -use clap::{App, AppSettings, Arg}; +use clap::{Arg, Command}; use path_absolutize::Absolutize; use qwik_core::{transform_fs, EntryStrategy, MinifyMode, TransformFsOptions}; struct OptimizerInput { glob: Option, + manifest: Option, src: PathBuf, dest: PathBuf, strategy: EntryStrategy, @@ -20,27 +21,25 @@ struct OptimizerInput { } fn main() -> Result<(), Box> { - let matches = App::new("qwik") + let matches = Command::new("qwik") .version("1.0") - .setting( - AppSettings::ArgRequiredElseHelp - | AppSettings::SubcommandRequiredElseHelp - | AppSettings::InferSubcommands - | AppSettings::DisableHelpSubcommand, - - ) + .arg_required_else_help(true) + .subcommand_required(true) + .infer_subcommands(true) + .disable_help_subcommand(true) + .subcommand_required(true).arg_required_else_help(true) .about("Qwik CLI allows to optimize qwik projects before bundling") .subcommand( - App::new("optimize") + Command::new("optimize") .about("takes a source directory of qwik code and outputs an optimized version that lazy loads") - .setting(AppSettings::ArgRequiredElseHelp) + .arg_required_else_help(true) .arg( Arg::new("src") .short('s') .long("src") .default_value(".") .takes_value(true) - .about("relative path to the source directory"), + .help("relative path to the source directory"), ) .arg( Arg::new("dest") @@ -48,30 +47,30 @@ fn main() -> Result<(), Box> { .long("dest") .required(true) .takes_value(true) - .about("relative path to the output directory"), - ) - .arg( - Arg::new("glob") - .short('g') - .long("glob") - .takes_value(true) - .about("glob used to match files within the source directory"), + .help("relative path to the output directory"), ) .arg( Arg::new("strategy") .long("strategy") .possible_values(["single", "hook", "smart", "component"]) .takes_value(true) - .about("entry strategy used to group hooks"), + .help("entry strategy used to group hooks"), + ) + .arg( + Arg::new("manifest") + .short('m') + .long("manifest") + .takes_value(true) + .help("filename of the manifest"), ) .arg( Arg::new("no-transpile") .long("no-transpile") - .about("transpile TS and JSX into JS").takes_value(false) + .help("transpile TS and JSX into JS").takes_value(false) ) - .arg(Arg::new("minify").long("minify").possible_values(["minify", "simplify", "none"]).takes_value(true).about("outputs minified source code")) - .arg(Arg::new("sourcemaps").long("sourcemaps").about("generates sourcemaps").takes_value(false)) - .arg(Arg::new("extensions").long("extensions").about("keep explicit extensions on imports").takes_value(false)), + .arg(Arg::new("minify").long("minify").possible_values(["minify", "simplify", "none"]).takes_value(true).help("outputs minified source code")) + .arg(Arg::new("sourcemaps").long("sourcemaps").help("generates sourcemaps").takes_value(false)) + .arg(Arg::new("extensions").long("extensions").help("keep explicit extensions on imports").takes_value(false)), ) .get_matches(); @@ -80,6 +79,7 @@ fn main() -> Result<(), Box> { if let Some(matches) = matches.subcommand_matches("optimize") { // "$ myapp test" was run let strategy = match matches.value_of("strategy") { + Some("inline") => EntryStrategy::Inline, Some("hook") => EntryStrategy::Hook, Some("single") => EntryStrategy::Single, Some("component") => EntryStrategy::Component, @@ -95,6 +95,7 @@ fn main() -> Result<(), Box> { optimize(OptimizerInput { src: matches.value_of_t_or_exit("src"), dest: matches.value_of_t_or_exit("dest"), + manifest: matches.value_of("manifest").map(|s| s.into()), glob: None, strategy, minify, @@ -124,6 +125,9 @@ fn optimize( scope: None, })?; - result.write_to_fs(¤t_dir.join(optimizer_input.dest).absolutize()?)?; + result.write_to_fs( + ¤t_dir.join(optimizer_input.dest).absolutize()?, + optimizer_input.manifest, + )?; Ok(result) } diff --git a/packages/qwik/src/optimizer/core/Cargo.toml b/packages/qwik/src/optimizer/core/Cargo.toml index bba836ea017..f594d9b74ca 100644 --- a/packages/qwik/src/optimizer/core/Cargo.toml +++ b/packages/qwik/src/optimizer/core/Cargo.toml @@ -18,6 +18,7 @@ swc_common = { version = "0.18.1", features = ["sourcemap"] } swc_atoms = "0.2.11" serde = "1.0.137" serde_bytes = "0.11.6" +serde_json = "1.0.81" simple-error = "0.2.3" base64 = "0.13.0" pathdiff = "0.2.1" @@ -30,7 +31,6 @@ path-slash="0.1.4" [dev-dependencies] insta = "1.14.0" -serde_json = "1.0.81" [features] fs=[] diff --git a/packages/qwik/src/optimizer/core/benches/transform.rs b/packages/qwik/src/optimizer/core/benches/transform.rs index 7572011843d..09d85507d50 100644 --- a/packages/qwik/src/optimizer/core/benches/transform.rs +++ b/packages/qwik/src/optimizer/core/benches/transform.rs @@ -195,6 +195,7 @@ fn transform_todo_app(b: &mut Bencher) { transpile: true, entry_strategy: EntryStrategy::Single, dev: true, + scope: None, }) }); } diff --git a/packages/qwik/src/optimizer/core/src/lib.rs b/packages/qwik/src/optimizer/core/src/lib.rs index cf67519dfab..9806eb82883 100644 --- a/packages/qwik/src/optimizer/core/src/lib.rs +++ b/packages/qwik/src/optimizer/core/src/lib.rs @@ -1,6 +1,7 @@ #![deny(clippy::all)] #![deny(clippy::perf)] #![deny(clippy::nursery)] +#![allow(clippy::use_self)] #[cfg(test)] mod test; diff --git a/packages/qwik/src/optimizer/core/src/parse.rs b/packages/qwik/src/optimizer/core/src/parse.rs index e0a9dda6db9..416fe7c168a 100644 --- a/packages/qwik/src/optimizer/core/src/parse.rs +++ b/packages/qwik/src/optimizer/core/src/parse.rs @@ -1,4 +1,5 @@ use std::collections::hash_map::DefaultHasher; +use std::collections::HashMap; use std::ffi::OsStr; use std::hash::Hasher; use std::path::{Path, PathBuf}; @@ -77,6 +78,22 @@ pub struct TransformOutput { pub is_jsx: bool, } +#[derive(Debug, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct QwikBundle { + pub size: usize, + pub symbols: Vec, +} + +#[derive(Debug, Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct QwikManifest { + pub version: JsWord, + pub symbols: HashMap, + pub bundles: HashMap, + pub mapping: HashMap, +} + impl TransformOutput { pub fn new() -> Self { Self::default() @@ -90,8 +107,37 @@ impl TransformOutput { self } + pub fn get_manifest(&self) -> QwikManifest { + let mut manifest = QwikManifest { + bundles: HashMap::new(), + symbols: HashMap::new(), + mapping: HashMap::new(), + version: "1".into(), + }; + for module in &self.modules { + if let Some(hook) = &module.hook { + let filename = + JsWord::from(format!("{}.{}", hook.canonical_filename, hook.extension)); + manifest.mapping.insert(hook.name.clone(), filename.clone()); + manifest.symbols.insert(hook.name.clone(), hook.clone()); + manifest.bundles.insert( + filename.clone(), + QwikBundle { + symbols: vec![hook.name.clone()], + size: module.code.len(), + }, + ); + } + } + manifest + } + #[cfg(feature = "fs")] - pub fn write_to_fs(&self, destination: &Path) -> Result { + pub fn write_to_fs( + &self, + destination: &Path, + manifest: Option, + ) -> Result { for module in &self.modules { let write_path = destination.join(&module.path); fs::create_dir_all(&write_path.parent().with_context(|| { @@ -99,6 +145,12 @@ impl TransformOutput { })?)?; fs::write(write_path, &module.code)?; } + if let Some(manifest) = manifest { + let write_path = destination.join(manifest); + let manifest = self.get_manifest(); + let json = serde_json::to_string(&manifest)?; + fs::write(write_path, json)?; + } Ok(self.modules.len()) } } diff --git a/rust-toolchain b/rust-toolchain index 480e8aa7c14..91951fd8ad7 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -nightly-2022-02-23 +1.61.0