Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert "fix(optimizer): let the bundler handle entries" #7298

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
157 changes: 154 additions & 3 deletions packages/qwik/src/optimizer/core/src/code_move.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
use crate::collector::{new_ident_from_id, GlobalCollect, Id, ImportKind};
use crate::parse::PathData;
use crate::parse::{
emit_source_code, might_need_handle_watch, PathData, SegmentAnalysis, TransformModule,
TransformOutput,
};
use crate::transform::{add_handle_watch, create_synthetic_named_import};
use crate::words::*;

use anyhow::Error;
use std::collections::BTreeMap;
use std::path::Path;

use anyhow::{Context, Error};
use path_slash::PathExt;
use swc_atoms::JsWord;
use swc_common::comments::{SingleThreadedComments, SingleThreadedCommentsMap};
use swc_common::DUMMY_SP;
use swc_common::{sync::Lrc, SourceMap, DUMMY_SP};
use swc_ecmascript::ast;
use swc_ecmascript::utils::private_ident;

Expand Down Expand Up @@ -151,6 +158,32 @@ pub fn new_module(ctx: NewModuleCtx) -> Result<(ast::Module, SingleThreadedComme
Ok((module, comments))
}

pub fn fix_path<S: AsRef<Path>, D: AsRef<Path>>(
src: S,
dest: D,
ident: &str,
) -> Result<JsWord, Error> {
let src = src.as_ref();
let dest = dest.as_ref();
if ident.starts_with('.') {
let diff = pathdiff::diff_paths(src, dest);

if let Some(diff) = diff {
let normalize = diff.to_slash_lossy();
let relative = relative_path::RelativePath::new(&normalize);
let final_path = relative.join(ident).normalize();
let final_str = final_path.as_str();
return Ok(if final_str.starts_with('.') {
JsWord::from(final_str)
} else {
JsWord::from(format!("./{}", final_str))
});
}
}

Ok(JsWord::from(ident))
}

fn create_named_export(expr: Box<ast::Expr>, name: &str) -> ast::ModuleItem {
ast::ModuleItem::ModuleDecl(ast::ModuleDecl::ExportDecl(ast::ExportDecl {
span: DUMMY_SP,
Expand All @@ -173,6 +206,124 @@ fn create_named_export(expr: Box<ast::Expr>, name: &str) -> ast::ModuleItem {
}))
}

#[test]
fn test_fix_path() {
assert_eq!(
fix_path("src", "", "./state.qwik.mjs").unwrap(),
JsWord::from("./src/state.qwik.mjs")
);

assert_eq!(
fix_path("src/path", "", "./state").unwrap(),
JsWord::from("./src/path/state")
);

assert_eq!(
fix_path("src", "", "../state").unwrap(),
JsWord::from("./state")
);
assert_eq!(
fix_path("a", "a", "./state").unwrap(),
JsWord::from("./state")
);
}

pub fn generate_entries(
mut output: TransformOutput,
core_module: &JsWord,
explicit_extensions: bool,
root_dir: Option<&Path>,
) -> Result<TransformOutput, anyhow::Error> {
let source_map = Lrc::new(SourceMap::default());
let mut entries_map: BTreeMap<&str, Vec<&SegmentAnalysis>> = BTreeMap::new();
let mut new_modules = Vec::with_capacity(output.modules.len());
{
let segments: Vec<&SegmentAnalysis> =
output.modules.iter().flat_map(|m| &m.segment).collect();
for segment in segments {
if let Some(ref e) = segment.entry {
entries_map.entry(e.as_ref()).or_default().push(segment);
}
}

for (entry, segments) in &entries_map {
let module = new_entry_module(entry, segments, core_module, explicit_extensions);
let (code, map) =
emit_source_code(Lrc::clone(&source_map), None, &module, root_dir, false)
.context("Emitting source code")?;
new_modules.push(TransformModule {
path: [entry, ".js"].concat(),
code,
map,
is_entry: true,
segment: None,
order: 0,
});
}
}
output.modules.append(&mut new_modules);

Ok(output)
}

fn new_entry_module(
path: &str,
segments: &[&SegmentAnalysis],
core_module: &JsWord,
explicit_extensions: bool,
) -> ast::Module {
let mut module = ast::Module {
span: DUMMY_SP,
body: Vec::with_capacity(segments.len()),
shebang: None,
};
let mut need_handle_watch = false;
for segment in segments {
// TODO fix the path from the entry to the segment in case of mismatched location
let mut src = fix_path(
segment.path.to_string(),
Path::new(path).parent().unwrap().to_str().unwrap(),
&["./", &segment.canonical_filename].concat(),
)
.unwrap()
.to_string();
if explicit_extensions {
src = src + "." + segment.extension.as_ref();
}
if might_need_handle_watch(&segment.ctx_kind, &segment.ctx_name) {
need_handle_watch = true;
}
module
.body
.push(ast::ModuleItem::ModuleDecl(ast::ModuleDecl::ExportNamed(
ast::NamedExport {
span: DUMMY_SP,
type_only: false,
with: None,
src: Some(Box::new(ast::Str {
span: DUMMY_SP,
value: JsWord::from(src),
raw: None,
})),
specifiers: vec![ast::ExportSpecifier::Named(ast::ExportNamedSpecifier {
is_type_only: false,
span: DUMMY_SP,
orig: ast::ModuleExportName::Ident(ast::Ident::new(
segment.name.clone(),
DUMMY_SP,
Default::default(),
)),
exported: None,
})],
},
)));
}
if need_handle_watch {
add_handle_watch(&mut module.body, core_module);
}
module
}

pub fn transform_function_expr(
expr: ast::Expr,
use_lexical_scope: &Id,
Expand Down
36 changes: 35 additions & 1 deletion packages/qwik/src/optimizer/core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ use std::path::Path;
use std::str;
use swc_atoms::JsWord;

use crate::code_move::generate_entries;
use crate::entry_strategy::parse_entry_strategy;
pub use crate::entry_strategy::EntryStrategy;
pub use crate::parse::EmitMode;
Expand Down Expand Up @@ -162,7 +163,23 @@ pub fn transform_fs(config: TransformFsOptions) -> Result<TransformOutput, Error
.reduce(|| Ok(TransformOutput::new()), |x, y| Ok(x?.append(&mut y?)))?;

final_output.modules.sort_unstable_by_key(|key| key.order);

if !matches!(
config.entry_strategy,
EntryStrategy::Hook | EntryStrategy::Inline | EntryStrategy::Hoist
) {
final_output = generate_entries(
final_output,
&core_module,
config.explicit_extensions,
root_dir,
)?;
}
// final_output = generate_entries(
// final_output,
// &core_module,
// config.explicit_extensions,
// root_dir,
// )?;
Ok(final_output)
}

Expand Down Expand Up @@ -218,6 +235,23 @@ pub fn transform_modules(config: TransformModulesOptions) -> Result<TransformOut

let mut final_output = final_output?;
final_output.modules.sort_unstable_by_key(|key| key.order);
if !matches!(
config.entry_strategy,
EntryStrategy::Hook | EntryStrategy::Inline | EntryStrategy::Hoist
) {
final_output = generate_entries(
final_output,
&core_module,
config.explicit_extensions,
root_dir,
)?;
}
// final_output = generate_entries(
// final_output,
// &core_module,
// config.explicit_extensions,
// root_dir,
// )?;

Ok(final_output)
}
6 changes: 4 additions & 2 deletions packages/qwik/src/optimizer/core/src/parse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,6 @@ pub fn transform_code(config: TransformCodeOptions) -> Result<TransformOutput, a
let mut modules: Vec<TransformModule> = Vec::with_capacity(segments.len() + 10);

let comments_maps = comments.clone().take_all();
// Now process each segment
if !segments.is_empty() {
let q = qt.as_ref().unwrap();
for h in segments.into_iter() {
Expand All @@ -407,7 +406,8 @@ pub fn transform_code(config: TransformCodeOptions) -> Result<TransformOutput, a
]
.concat();
let need_handle_watch =
might_need_handle_watch(&h.data.ctx_kind, &h.data.ctx_name);
might_need_handle_watch(&h.data.ctx_kind, &h.data.ctx_name)
&& is_entry;

let (mut segment_module, comments) = new_module(NewModuleCtx {
expr: h.expr,
Expand Down Expand Up @@ -709,6 +709,7 @@ fn handle_error(
pub struct PathData {
pub abs_path: PathBuf,
pub rel_path: PathBuf,
pub base_dir: PathBuf,
pub abs_dir: PathBuf,
pub rel_dir: PathBuf,
pub file_stem: String,
Expand Down Expand Up @@ -738,6 +739,7 @@ pub fn parse_path(src: &str, base_dir: &Path) -> Result<PathData, Error> {

Ok(PathData {
abs_path,
base_dir: base_dir.to_path_buf(),
rel_path: path.into(),
abs_dir,
rel_dir,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ export const App = component$(() => {

import dep3 from "dep3/something";
export const Header_component_Header_onClick_KjD9TCNkNxY = (ev)=>dep3(ev);
export { _hW } from "@builder.io/qwik";


Some("{\"version\":3,\"sources\":[\"/user/qwik/src/project/test.tsx\"],\"names\":[],\"mappings\":\";2DAQ2B,CAAC,KAAO,KAAK\"}")
Expand Down Expand Up @@ -61,13 +60,13 @@ import { bar as bbar } from "../state";
import * as dep2 from "dep2";
import { qrl } from "@builder.io/qwik";
export const Header_component_UVBJuFYfvDo = ()=>{
return <Header onClick={/*#__PURE__*/ qrl(()=>import("./test.tsx_Header_component_Header_onClick_KjD9TCNkNxY"), "Header_component_Header_onClick_KjD9TCNkNxY")}>
return <Header onClick={/*#__PURE__*/ qrl(()=>import("../entry_segments"), "Header_component_Header_onClick_KjD9TCNkNxY")}>
{dep2.stuff()}{bbar()}
</Header>;
};


Some("{\"version\":3,\"sources\":[\"/user/qwik/src/project/test.tsx\"],\"names\":[],\"mappings\":\";;;;4CAMiC;IAC7B,QACK,OAAO,iJAA8B;YAClC,CAAC,KAAK,KAAK,IAAI,OAAO;QAC1B,EAAE;AAEV\"}")
Some("{\"version\":3,\"sources\":[\"/user/qwik/src/project/test.tsx\"],\"names\":[],\"mappings\":\";;;;4CAMiC;IAC7B,QACK,OAAO,4GAA8B;YAClC,CAAC,KAAK,KAAK,IAAI,OAAO;QAC1B,EAAE;AAEV\"}")
/*
{
"origin": "project/test.tsx",
Expand Down Expand Up @@ -122,11 +121,20 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/project/test.tsx\"],\"names\"

import { componentQrl } from "@builder.io/qwik";
import { qrl } from "@builder.io/qwik";
export const Header = /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrl(()=>import("./test.tsx_Header_component_UVBJuFYfvDo"), "Header_component_UVBJuFYfvDo"));
export const App = /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrl(()=>import("./test.tsx_App_component_wGkRHWXaqjs"), "App_component_wGkRHWXaqjs"));
export const Header = /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrl(()=>import("../entry_segments"), "Header_component_UVBJuFYfvDo"));
export const App = /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrl(()=>import("../entry_segments"), "App_component_wGkRHWXaqjs"));


Some("{\"version\":3,\"sources\":[\"/user/qwik/src/project/test.tsx\"],\"names\":[],\"mappings\":\";;AAMA,OAAO,MAAM,uBAAS,iGAMnB;AAEH,OAAO,MAAM,oBAAM,8FAIhB\"}")
============================= entry_segments.js (ENTRY POINT)==

export { Header_component_Header_onClick_KjD9TCNkNxY } from "./project/test.tsx_Header_component_Header_onClick_KjD9TCNkNxY";
export { Header_component_UVBJuFYfvDo } from "./project/test.tsx_Header_component_UVBJuFYfvDo";
export { App_component_wGkRHWXaqjs } from "./project/test.tsx_App_component_wGkRHWXaqjs";
export { _hW } from "@builder.io/qwik";


Some("{\"version\":3,\"sources\":[\"/user/qwik/src/project/test.tsx\"],\"names\":[],\"mappings\":\";;AAMA,OAAO,MAAM,uBAAS,uHAMnB;AAEH,OAAO,MAAM,oBAAM,iHAIhB\"}")
None
== DIAGNOSTICS ==

[]
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ export default component$(() => {

import { componentQrl } from "@builder.io/qwik";
import { qrl } from "@builder.io/qwik";
export default /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrl(()=>import("./[[...slug]].tsx_slug_component_0AM8HPnkNs4.js"), "slug_component_0AM8HPnkNs4"));
export default /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrl(()=>import("../../../../src/routes/_repl/[id]/[[...slug]].tsx_entry_[[...slug]].js"), "slug_component_0AM8HPnkNs4"));


Some("{\"version\":3,\"sources\":[\"/user/qwik/src/src/routes/_repl/[id]/[[...slug]].tsx\"],\"names\":[],\"mappings\":\";;AAIA,6BAAe,6HAKZ\"}")
Some("{\"version\":3,\"sources\":[\"/user/qwik/src/src/routes/_repl/[id]/[[...slug]].tsx\"],\"names\":[],\"mappings\":\";;AAIA,6BAAe,oJAKZ\"}")
============================= src/routes/_repl/[id]/[[...slug]].tsx_slug_component_div_onClick_xevvy0Qc7pA.js (ENTRY POINT)==

import { sibling } from "./sibling";
Expand Down Expand Up @@ -85,6 +85,12 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/src/routes/_repl/[id]/[[...sl
]
}
*/
============================= src/routes/_repl/[id]/[[...slug]].tsx_entry_[[...slug]].js (ENTRY POINT)==

export { slug_component_0AM8HPnkNs4 } from "./[[...slug]].tsx_slug_component_0AM8HPnkNs4.js";


None
== DIAGNOSTICS ==

[]
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ export const App = component$((props) => {

import { componentQrl } from "@builder.io/qwik";
import { qrl } from "@builder.io/qwik";
export const App = /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrl(()=>import("./test.tsx_App_component_ckEPmXZlub0.tsx"), "App_component_ckEPmXZlub0"));
export const App = /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrl(()=>import("./entry_segments.tsx"), "App_component_ckEPmXZlub0"));


Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;AAGA,OAAO,MAAM,oBAAM,qHAKhB\"}")
Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;AAGA,OAAO,MAAM,oBAAM,iGAKhB\"}")
============================= test.tsx_App_component_useStyles_t35nSa5UV7U.tsx ==

export const App_component_useStyles_t35nSa5UV7U = 'hola';
Expand Down Expand Up @@ -55,8 +55,8 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma
import { qrl } from "@builder.io/qwik";
import { useStylesQrl } from "@builder.io/qwik";
export const App_component_ckEPmXZlub0 = (props)=>{
useStylesQrl(/*#__PURE__*/ qrl(()=>import("./test.tsx_App_component_useStyles_t35nSa5UV7U.tsx"), "App_component_useStyles_t35nSa5UV7U"));
return /*#__PURE__*/ qrl(()=>import("./test.tsx_App_component_1_w0t0o3QMovU.tsx"), "App_component_1_w0t0o3QMovU");
useStylesQrl(/*#__PURE__*/ qrl(()=>import("./entry_segments.tsx"), "App_component_useStyles_t35nSa5UV7U"));
return /*#__PURE__*/ qrl(()=>import("./entry_segments.tsx"), "App_component_1_w0t0o3QMovU");
};


Expand Down Expand Up @@ -84,7 +84,6 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma
============================= test.tsx_App_component_1_w0t0o3QMovU.tsx ==

export const App_component_1_w0t0o3QMovU = ()=><div></div>;
export { _hW } from "@builder.io/qwik";


Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\"2CAKa,KACJ,MAAM\"}")
Expand All @@ -108,6 +107,15 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma
]
}
*/
============================= entry_segments.js (ENTRY POINT)==

export { App_component_useStyles_t35nSa5UV7U } from "./test.tsx_App_component_useStyles_t35nSa5UV7U.tsx";
export { App_component_ckEPmXZlub0 } from "./test.tsx_App_component_ckEPmXZlub0.tsx";
export { App_component_1_w0t0o3QMovU } from "./test.tsx_App_component_1_w0t0o3QMovU.tsx";
export { _hW } from "@builder.io/qwik";


None
== DIAGNOSTICS ==

[]
Loading