diff --git a/.changeset/easy-geese-watch.md b/.changeset/easy-geese-watch.md new file mode 100644 index 00000000000..911f65ffd4e --- /dev/null +++ b/.changeset/easy-geese-watch.md @@ -0,0 +1,5 @@ +--- +'@qwik.dev/core': patch +--- + +fix: convert any destructured props to restProps helper diff --git a/.changeset/many-forks-ring.md b/.changeset/many-forks-ring.md new file mode 100644 index 00000000000..da72f993e4f --- /dev/null +++ b/.changeset/many-forks-ring.md @@ -0,0 +1,5 @@ +--- +'@qwik.dev/core': patch +--- + +fix: avoid potential name conflicts with rest props diff --git a/packages/qwik/src/core/qwik.core.api.md b/packages/qwik/src/core/qwik.core.api.md index f8e2c27992a..bed6972a1ab 100644 --- a/packages/qwik/src/core/qwik.core.api.md +++ b/packages/qwik/src/core/qwik.core.api.md @@ -900,7 +900,7 @@ export interface ResourceResolved { export type ResourceReturn = ResourcePending | ResourceResolved | ResourceRejected; // @internal (undocumented) -export const _restProps: (props: PropsProxy, omit: string[], target?: Props) => Props; +export const _restProps: (props: PropsProxy, omit?: string[], target?: Props) => Props; // @internal export const _run: (...args: unknown[]) => ValueOrPromise; diff --git a/packages/qwik/src/core/shared/utils/prop.ts b/packages/qwik/src/core/shared/utils/prop.ts index 95e2049aa07..53d16ae8c98 100644 --- a/packages/qwik/src/core/shared/utils/prop.ts +++ b/packages/qwik/src/core/shared/utils/prop.ts @@ -7,7 +7,7 @@ export function isSlotProp(prop: string): boolean { } /** @internal */ -export const _restProps = (props: PropsProxy, omit: string[], target: Props = {}) => { +export const _restProps = (props: PropsProxy, omit: string[] = [], target: Props = {}) => { let constPropsTarget: Props | null = null; const constProps = props[_CONST_PROPS]; if (constProps) { diff --git a/packages/qwik/src/optimizer/core/src/props_destructuring.rs b/packages/qwik/src/optimizer/core/src/props_destructuring.rs index 5fe5ebab9f2..80d82841776 100644 --- a/packages/qwik/src/optimizer/core/src/props_destructuring.rs +++ b/packages/qwik/src/optimizer/core/src/props_destructuring.rs @@ -56,13 +56,13 @@ enum TransformInit { impl<'a> PropsDestructuring<'a> { fn transform_component_props(&mut self, arrow: &mut ast::ArrowExpr) { if let Some(ast::Pat::Object(obj)) = arrow.params.first() { - let new_ident = private_ident!("props"); - if let Some((rest_id, local)) = + let new_ident = private_ident!("_rawProps"); + if let Some((rest_id_opt, local)) = transform_pat(ast::Expr::Ident(new_ident.clone()), obj, self) { - if let Some(rest_id) = rest_id { + if let Some(rest_id) = rest_id_opt { let omit_fn = self.global_collect.import(&_REST_PROPS, self.core_module); - let omit = local.iter().map(|(_, id, _)| id.clone()).collect(); + let omit: Vec = local.iter().map(|(_, id, _)| id.clone()).collect(); transform_rest( arrow, &omit_fn, @@ -413,9 +413,10 @@ fn transform_pat( } } } - if skip || local.is_empty() { + if skip { return None; } + // Allow case with only rest binding (no local fields) Some((rest_id, local)) } @@ -426,7 +427,30 @@ fn transform_rest( props_expr: ast::Expr, omit: Vec, ) { - let new_stmt = create_omit_props(omit_fn, rest_id, props_expr, omit); + let new_stmt = if omit.is_empty() { + // const rest = _restProps(rawProps); + ast::Stmt::Decl(ast::Decl::Var(Box::new(ast::VarDecl { + kind: ast::VarDeclKind::Const, + decls: vec![ast::VarDeclarator { + definite: false, + span: DUMMY_SP, + init: Some(Box::new(ast::Expr::Call(ast::CallExpr { + callee: ast::Callee::Expr(Box::new(ast::Expr::Ident(new_ident_from_id( + omit_fn, + )))), + args: vec![ast::ExprOrSpread { + spread: None, + expr: Box::new(props_expr), + }], + ..Default::default() + }))), + name: ast::Pat::Ident(ast::BindingIdent::from(new_ident_from_id(rest_id))), + }], + ..Default::default() + }))) + } else { + create_omit_props(omit_fn, rest_id, props_expr, omit) + }; match &mut arrow.body { box ast::BlockStmtOrExpr::BlockStmt(block) => { block.stmts.insert(0, new_stmt); diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_block_stmt.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_block_stmt.snap index 4d702b8a143..f2c71644931 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_block_stmt.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_block_stmt.snap @@ -24,13 +24,13 @@ import { _fnSignal } from "@qwik.dev/core"; import { qrl } from "@qwik.dev/core"; import { _jsxSorted } from "@qwik.dev/core"; const i_GbMO6TGQv9M = ()=>import("./test.tsx_test_div_onClick_GbMO6TGQv9M"); -export default ((props)=>{ +export default ((_rawProps)=>{ return /*#__PURE__*/ _jsxSorted("div", { "data-is-active": _fnSignal((p0)=>p0.data.selectedOutputDetail === 'options', [ - props + _rawProps ], 'p0.data.selectedOutputDetail==="options"'), onClick$: /*#__PURE__*/ qrl(i_GbMO6TGQv9M, "test_div_onClick_GbMO6TGQv9M", [ - props + _rawProps ]) }, null, null, 2, "u6_0"); }); @@ -41,12 +41,12 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma import { useLexicalScope } from "@qwik.dev/core"; export const test_div_onClick_GbMO6TGQv9M = ()=>{ - const [props] = useLexicalScope(); - props.data.selectedOutputDetail = 'options'; + const [_rawProps] = useLexicalScope(); + _rawProps.data.selectedOutputDetail = 'options'; }; -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";4CAKwB;;IACR,MALI,KAKC,oBAAoB,GAAG\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";4CAKwB;;IACR,UALI,KAKC,oBAAoB,GAAG\"}") /* { "origin": "test.tsx", @@ -66,7 +66,7 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma 259 ], "captureNames": [ - "props" + "_rawProps" ] } */ diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_expr_stmt.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_expr_stmt.snap index 9b38b07e5f4..bcb56fba80b 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_expr_stmt.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_expr_stmt.snap @@ -21,27 +21,27 @@ import { _fnSignal } from "@qwik.dev/core"; import { qrl } from "@qwik.dev/core"; import { _jsxSorted } from "@qwik.dev/core"; const i_GbMO6TGQv9M = ()=>import("./test.tsx_test_div_onClick_GbMO6TGQv9M"); -export default ((props)=>/*#__PURE__*/ _jsxSorted("div", { +export default ((_rawProps)=>/*#__PURE__*/ _jsxSorted("div", { "data-is-active": _fnSignal((p0)=>p0.data.selectedOutputDetail === 'options', [ - props + _rawProps ], 'p0.data.selectedOutputDetail==="options"'), onClick$: /*#__PURE__*/ qrl(i_GbMO6TGQv9M, "test_div_onClick_GbMO6TGQv9M", [ - props + _rawProps ]) }, null, null, 2, "u6_0")); -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;AACE,eAAe,CAAA,uBACL,WAAC;QACC,gBAAc,kBAAE,GAFV,KAEe,oBAAoB,KAAK;;;QAC9C,QAAQ;;;6BAGT,EAAE\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;AACE,eAAe,CAAA,2BACL,WAAC;QACC,gBAAc,kBAAE,GAFV,KAEe,oBAAoB,KAAK;;;QAC9C,QAAQ;;;6BAGT,EAAE\"}") ============================= test.tsx_test_div_onClick_GbMO6TGQv9M.js (ENTRY POINT)== import { useLexicalScope } from "@qwik.dev/core"; export const test_div_onClick_GbMO6TGQv9M = ()=>{ - const [props] = useLexicalScope(); - props.data.selectedOutputDetail = 'options'; + const [_rawProps] = useLexicalScope(); + _rawProps.data.selectedOutputDetail = 'options'; }; -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";4CAIwB;;IACR,MAJI,KAIC,oBAAoB,GAAG\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";4CAIwB;;IACR,UAJI,KAIC,oBAAoB,GAAG\"}") /* { "origin": "test.tsx", @@ -61,7 +61,7 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma 238 ], "captureNames": [ - "props" + "_rawProps" ] } */ diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_dead_code.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_dead_code.snap index 918e3fa174b..fbaf3d67858 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_dead_code.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_dead_code.snap @@ -23,7 +23,7 @@ export const Foo = component$(({foo}) => { ============================= test.tsx_Foo_component_HTDRsvUbLiE.tsx (ENTRY POINT)== -export const Foo_component_HTDRsvUbLiE = (props)=>{ +export const Foo_component_HTDRsvUbLiE = (_rawProps)=>{ useMount$(()=>{}); return
; }; @@ -49,7 +49,7 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma 199 ], "paramNames": [ - "props" + "_rawProps" ] } */ diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_invalid_references.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_invalid_references.snap index cc5568bba1f..6e02dd158c5 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_invalid_references.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_invalid_references.snap @@ -61,7 +61,7 @@ import { _auto_I8 as I8 } from "./test"; import { _auto_I9 as I9 } from "./test"; import { qrl } from "@qwik.dev/core"; const i_w0t0o3QMovU = ()=>import("./test.tsx_App_component_1_w0t0o3QMovU"); -export const App_component_ckEPmXZlub0 = (props)=>{ +export const App_component_ckEPmXZlub0 = (_rawProps)=>{ console.log(I1, I2, I3, I4, I5, I6, I7, I8, I9); console.log(itsok, v1, v2, v3, obj); return /*#__PURE__*/ qrl(i_w0t0o3QMovU, "App_component_1_w0t0o3QMovU"); @@ -88,7 +88,7 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma 346 ], "paramNames": [ - "props" + "_rawProps" ] } */ diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_issue_33443.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_issue_33443.snap index 86e436f979f..5b41353d25f 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_issue_33443.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_issue_33443.snap @@ -35,13 +35,13 @@ const Issue3742_component_div_button_onClick_a504K2BCEXg = ()=>{ const [counter] = useLexicalScope(); return counter.value++; }; -const Issue3742_component_svSy0PlWTAw = (props)=>{ +const Issue3742_component_svSy0PlWTAw = (_rawProps)=>{ const counter = useSignal(0); return /*#__PURE__*/ _jsxSorted("div", { - title: _fnSignal((p0, p1)=>(p1.description ?? '') && 'description' in p1.other ? `Hello ${p0.value}` : `Bye ${p0.value}`, [ - counter, - props - ], '(p1.description??"")&&"description"in p1.other?`Hello ${p0.value}`:`Bye ${p0.value}`') + title: _fnSignal((p0, p1)=>(p0.description ?? '') && 'description' in p0.other ? `Hello ${p1.value}` : `Bye ${p1.value}`, [ + _rawProps, + counter + ], '(p0.description??"")&&"description"in p0.other?`Hello ${p1.value}`:`Bye ${p1.value}`') }, null, [ "Issue3742", /*#__PURE__*/ _jsxSorted("button", null, { diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_lightweight_functional.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_lightweight_functional.snap index 9bef19f643c..2961c1b552d 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_lightweight_functional.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_lightweight_functional.snap @@ -72,12 +72,12 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma import { useLexicalScope } from "@qwik.dev/core"; export const ButtonArrow_button_onClick_9npo43fIGik = ()=>{ - const [props] = useLexicalScope(); - return console.log(props.text, props.color); + const [_rawProps] = useLexicalScope(); + return console.log(_rawProps.text, _rawProps.color); }; -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";sDAsBqC;;WAAI,QAAQ,GAAG,OAFvB,YAAM\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";sDAsBqC;;WAAI,QAAQ,GAAG,WAFvB,gBAAM\"}") /* { "origin": "test.tsx", @@ -97,7 +97,7 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma 473 ], "captureNames": [ - "props" + "_rawProps" ] } */ @@ -151,14 +151,14 @@ export function Button({ text, color }) { text ])}>{text}; } -export const ButtonArrow = (props)=>{ - return ; +export const ButtonArrow = (_rawProps)=>{ + return ; }; -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;AAGA,OAAO,MAAM,oBAAM,4EAOhB;IACF,SAAS;AACV,GAAG;AAEH,OAAO,SAAS,OAAO,EAAC,IAAI,EAAE,KAAK,EAAC;IACnC,QACE,OAAO,UAAU,OAAO;;;SAAyC,OAAO;AAE3E;AAEA,OAAO,MAAM,cAAc;IAC1B,QACE,OAAO,gBAFyB,OAER;;eAFE,OAE8C;AAE3E,EAAC\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;AAGA,OAAO,MAAM,oBAAM,4EAOhB;IACF,SAAS;AACV,GAAG;AAEH,OAAO,SAAS,OAAO,EAAC,IAAI,EAAE,KAAK,EAAC;IACnC,QACE,OAAO,UAAU,OAAO;;;SAAyC,OAAO;AAE3E;AAEA,OAAO,MAAM,cAAc;IAC1B,QACE,OAAO,oBAFyB,OAER;;mBAFE,OAE8C;AAE3E,EAAC\"}") == DIAGNOSTICS == [] diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_multi_capture.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_multi_capture.snap index 47b7e11633b..69e9c8ceb9a 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_multi_capture.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_multi_capture.snap @@ -35,9 +35,9 @@ export const Bar = component$(({bar}) => { import { qrl } from "@qwik.dev/core"; const i_DvU6FitWglY = ()=>import("./test.tsx_Foo_component_1_DvU6FitWglY"); -export const Foo_component_HTDRsvUbLiE = (props)=>{ +export const Foo_component_HTDRsvUbLiE = (_rawProps)=>{ return /*#__PURE__*/ qrl(i_DvU6FitWglY, "Foo_component_1_DvU6FitWglY", [ - props + _rawProps ]); }; @@ -62,7 +62,7 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma 221 ], "paramNames": [ - "props" + "_rawProps" ] } */ @@ -81,9 +81,9 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma import { qrl } from "@qwik.dev/core"; const i_0xSyNSnVu3k = ()=>import("./test.tsx_Bar_component_1_0xSyNSnVu3k"); -export const Bar_component_L80pS8Hxf1Y = (props)=>{ +export const Bar_component_L80pS8Hxf1Y = (_rawProps)=>{ return /*#__PURE__*/ qrl(i_0xSyNSnVu3k, "Bar_component_1_0xSyNSnVu3k", [ - props + _rawProps ]); }; @@ -108,7 +108,7 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma 335 ], "paramNames": [ - "props" + "_rawProps" ] } */ @@ -116,15 +116,15 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma import { useLexicalScope } from "@qwik.dev/core"; export const Foo_component_1_DvU6FitWglY = ()=>{ - const [props] = useLexicalScope(); + const [_rawProps] = useLexicalScope(); const fn = ({ aaa })=>aaa; return
- {props.foo}{fn()}{20} + {_rawProps.foo}{fn()}{20}
; }; -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";2CAKU;;IACR,MAAM,KAAK,CAAC,EAAC,GAAG,EAAC,GAAK;IACtB,QACE,IAAI;IACJ,OAN4B,KAMtB,MALI,GAKO;GAClB,EAAE\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";2CAKU;;IACR,MAAM,KAAK,CAAC,EAAC,GAAG,EAAC,GAAK;IACtB,QACE,IAAI;IACJ,WAN4B,KAMtB,MALI,GAKO;GAClB,EAAE\"}") /* { "origin": "test.tsx", @@ -144,7 +144,7 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma 217 ], "captureNames": [ - "props" + "_rawProps" ] } */ @@ -152,14 +152,14 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma import { useLexicalScope } from "@qwik.dev/core"; export const Bar_component_1_0xSyNSnVu3k = ()=>{ - const [props] = useLexicalScope(); + const [_rawProps] = useLexicalScope(); return
- {props.bar} + {_rawProps.bar}
; }; -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";2CAgBU;;IACR,QACE,IAAI;IACJ,OAJ4B,IAIvB;GACN,EAAE\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";2CAgBU;;IACR,QACE,IAAI;IACJ,WAJ4B,IAIvB;GACN,EAAE\"}") /* { "origin": "test.tsx", @@ -179,7 +179,7 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma 331 ], "captureNames": [ - "props" + "_rawProps" ] } */ diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_optimization_issue_3542.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_optimization_issue_3542.snap index 7b4e8186b96..f0045cd89fb 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_optimization_issue_3542.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_optimization_issue_3542.snap @@ -27,27 +27,27 @@ export const AtomStatus = component$(({ctx,atom})=>{ import { componentQrl } from "@qwik.dev/core"; import { useLexicalScope } from "@qwik.dev/core"; import { inlinedQrl } from "@qwik.dev/core"; -export const AtomStatus = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl((props)=>{ - let status = props.atom.status; - if (!props.atom.real) status = "WILL-VANISH"; - else if (JSON.stringify(props.atom.atom) == JSON.stringify(props.atom.real)) status = "WTFED"; - return { - const [props] = useLexicalScope(); - return atomStatusClick(props.ctx, ev, [ - props.atom +export const AtomStatus = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl((_rawProps)=>{ + let status = _rawProps.atom.status; + if (!_rawProps.atom.real) status = "WILL-VANISH"; + else if (JSON.stringify(_rawProps.atom.atom) == JSON.stringify(_rawProps.atom.real)) status = "WTFED"; + return { + const [_rawProps] = useLexicalScope(); + return atomStatusClick(_rawProps.ctx, ev, [ + _rawProps.atom ]); }, "AtomStatus_component_span_onClick_Owf5fKaOlF0", [ - props + _rawProps ])} class={[ "atom", status, - props.ctx.store[props.atom.ID] ? "selected" : null + _rawProps.ctx.store[_rawProps.atom.ID] ? "selected" : null ]}> ; }, "AtomStatus_component_hdwpoUtydSA")); -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;AAGA,OAAO,MAAM,2BAAa,sCAAW;IACpC,IAAI,SAAS,MAD6B,KACxB,MAAM;IACxB,IAAG,CAAC,MAFsC,KAEjC,IAAI,EACZ,SAAO;SACD,IAAI,KAAK,SAAS,CAAC,MAJgB,KAIX,IAAI,KAAG,KAAK,SAAS,CAAC,MAJX,KAIgB,IAAI,GAC7D,SAAO;IAER,QACE,KAAK,OAAO,MAR4B,KAQvB,EAAE,EAAE,mCAAU,CAAC;;eAAK,sBARD,KAQqB,IAAG;kBARpB;SAQ0B;;;QAAG,OAAO;QAAC;QAAO;QAAO,MARvD,IAQ2D,KAAK,CAAC,MAR7D,KAQkE,EAAE,CAAC,GAAC,aAAW;KAAK,EAAE;EACjI,EAAE;AAEJ,wCAAE\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;AAGA,OAAO,MAAM,2BAAa,sCAAW;IACpC,IAAI,SAAS,UAD6B,KACxB,MAAM;IACxB,IAAG,CAAC,UAFsC,KAEjC,IAAI,EACZ,SAAO;SACD,IAAI,KAAK,SAAS,CAAC,UAJgB,KAIX,IAAI,KAAG,KAAK,SAAS,CAAC,UAJX,KAIgB,IAAI,GAC7D,SAAO;IAER,QACE,KAAK,OAAO,UAR4B,KAQvB,EAAE,EAAE,mCAAU,CAAC;;eAAK,0BARD,KAQqB,IAAG;sBARpB;SAQ0B;;;QAAG,OAAO;QAAC;QAAO;QAAO,UARvD,IAQ2D,KAAK,CAAC,UAR7D,KAQkE,EAAE,CAAC,GAAC,aAAW;KAAK,EAAE;EACjI,EAAE;AAEJ,wCAAE\"}") == DIAGNOSTICS == [] diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_optimization.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_optimization.snap index 321fd8945cf..028e3cc1ffd 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_optimization.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_optimization.snap @@ -61,38 +61,38 @@ import { _getVarProps } from "@qwik.dev/core"; import { _getConstProps } from "@qwik.dev/core"; import { _jsxSplit } from "@qwik.dev/core"; import { _jsxSorted } from "@qwik.dev/core"; -export const Works = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl((props)=>{ - const rest = _restProps(props, [ +export const Works = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl((_rawProps)=>{ + const rest = _restProps(_rawProps, [ "count", "some", "hello", "stuff", "stuffDefault" ]); - console.log(props.stuff, props.some ?? 3); + console.log(_rawProps.stuff, _rawProps.some ?? 3); useTaskQrl(/*#__PURE__*/ inlinedQrl(({ track })=>{ - const [props, rest] = useLexicalScope(); - track(()=>props.count); - console.log(props.count, rest, props.stuff, props.some ?? 3, props.stuffDefault ?? 123); + const [_rawProps, rest] = useLexicalScope(); + track(()=>_rawProps.count); + console.log(_rawProps.count, rest, _rawProps.stuff, _rawProps.some ?? 3, _rawProps.stuffDefault ?? 123); }, "Works_component_useTask_pjo5U5Ikll0", [ - props, + _rawProps, rest ])); return /*#__PURE__*/ _jsxSplit("div", { some: _fnSignal((p0)=>p0.some ?? 3, [ - props + _rawProps ], "p0.some??1+2"), params: _fnSignal((p0)=>({ some: p0.some ?? 3 }), [ - props + _rawProps ], "{some:p0.some??1+2}"), - class: _wrapProp(props, "count"), + class: _wrapProp(_rawProps, "count"), ..._getVarProps(rest) }, { ..._getConstProps(rest), override: true - }, _wrapProp(props, "count"), 0, "u6_0"); + }, _wrapProp(_rawProps, "count"), 0, "u6_0"); }, "Works_component_t45qL4vNGv0")); export const NoWorks2 = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl(({ count, stuff: { hey } })=>{ console.log(hey); @@ -122,7 +122,7 @@ export const NoWorks3 = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl(({ c }, "NoWorks3_component_fc13h5yYn14")); -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;;;;;;;AAGA,OAAO,MAAM,sBAAQ,sCAAW;;;;;;;;IAO/B,QAAQ,GAAG,OAHX,aAFA,QAAO;IAMP,oCAAS,CAAC,EAAC,KAAK,EAAC;;QAChB,MAAM,UARP;QASC,QAAQ,GAAG,OATZ,OASoB,YANpB,aAFA,QAAO,SAGP,gBAAqB;;;;;IAOrB,qBACC,UAAC;QAAI,IAAI,qBAXV,QAAO;;;QAWW,MAAM,kBAAE,CAAA;gBAAE,IAAI,KAXhC,QAAO;YAW0B,CAAA;;;QAAG,KAAK;wBAAa;;0BAAA;QAAM,QAAQ;;AAErE,mCAAG;AAEH,OAAO,MAAM,yBAAW,sCAAW,CAAC,EAAC,KAAK,EAAE,OAAO,EAAC,GAAG,EAAC,EAAC;IACxD,QAAQ,GAAG,CAAC;IACZ,oCAAS,CAAC,EAAC,KAAK,EAAC;;QAChB,MAAM,IAAM;QACZ,QAAQ,GAAG,CAAC;;;;IAEb,qBACC,WAAC;QAAI,OAAO;aAAQ;AAEtB,sCAAG;AAEH,OAAO,MAAM,yBAAW,sCAAW,CAAC,EAAC,KAAK,EAAE,QAAQ,MAAM,EAAC;IAC1D,QAAQ,GAAG,CAAC;IACZ,oCAAS,CAAC,EAAC,KAAK,EAAC;;QAChB,MAAM,IAAM;QACZ,QAAQ,GAAG,CAAC;;;;IAEb,qBACC,WAAC;QAAI,OAAO;aAAQ;AAEtB,sCAAG\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;;;;;;;AAGA,OAAO,MAAM,sBAAQ,sCAAW;;;;;;;;IAO/B,QAAQ,GAAG,WAHX,iBAFA,QAAO;IAMP,oCAAS,CAAC,EAAC,KAAK,EAAC;;QAChB,MAAM,cARP;QASC,QAAQ,GAAG,WATZ,OASoB,gBANpB,iBAFA,QAAO,aAGP,gBAAqB;;;;;IAOrB,qBACC,UAAC;QAAI,IAAI,qBAXV,QAAO;;;QAWW,MAAM,kBAAE,CAAA;gBAAE,IAAI,KAXhC,QAAO;YAW0B,CAAA;;;QAAG,KAAK;wBAAa;;0BAAA;QAAM,QAAQ;;AAErE,mCAAG;AAEH,OAAO,MAAM,yBAAW,sCAAW,CAAC,EAAC,KAAK,EAAE,OAAO,EAAC,GAAG,EAAC,EAAC;IACxD,QAAQ,GAAG,CAAC;IACZ,oCAAS,CAAC,EAAC,KAAK,EAAC;;QAChB,MAAM,IAAM;QACZ,QAAQ,GAAG,CAAC;;;;IAEb,qBACC,WAAC;QAAI,OAAO;aAAQ;AAEtB,sCAAG;AAEH,OAAO,MAAM,yBAAW,sCAAW,CAAC,EAAC,KAAK,EAAE,QAAQ,MAAM,EAAC;IAC1D,QAAQ,GAAG,CAAC;IACZ,oCAAS,CAAC,EAAC,KAAK,EAAC;;QAChB,MAAM,IAAM;QACZ,QAAQ,GAAG,CAAC;;;;IAEb,qBACC,WAAC;QAAI,OAAO;aAAQ;AAEtB,sCAAG\"}") == DIAGNOSTICS == [] diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping.snap index caae21c356d..7857d7a5fc5 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping.snap @@ -30,27 +30,27 @@ import { _wrapProp } from "@qwik.dev/core"; import { _jsxSorted } from "@qwik.dev/core"; import { inlinedQrl } from "@qwik.dev/core"; import { useSignal } from '@qwik.dev/core'; -export const Works = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl((props)=>{ +export const Works = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl((_rawProps)=>{ let fromLocal = useSignal(0); return /*#__PURE__*/ _jsxSorted("div", { - computed: _fnSignal((p0, p1)=>p0 + p1.fromProps, [ - fromLocal, - props - ], "p0+p1.fromProps"), + computed: _fnSignal((p0, p1)=>p1 + p0.fromProps, [ + _rawProps, + fromLocal + ], "p1+p0.fromProps"), local: fromLocal, props: _fnSignal((p0, p1)=>({ - props: p1.fromProps, - local: p0 + props: p0.fromProps, + local: p1 }), [ - fromLocal, - props - ], "{props:p1.fromProps,local:p0}"), + _rawProps, + fromLocal + ], "{props:p0.fromProps,local:p1}"), "props-only": _fnSignal((p0)=>({ props: p0.fromProps }), [ - props + _rawProps ], "{props:p0.fromProps}"), - "props-wrap": _wrapProp(props, "fromProps") + "props-wrap": _wrapProp(_rawProps, "fromProps") }, null, null, 3, "u6_0"); }, "Works_component_t45qL4vNGv0")); diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping_children.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping_children.snap index 44c8d9a0f90..fafaeea4e8f 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping_children.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping_children.snap @@ -30,30 +30,30 @@ import { _fnSignal } from "@qwik.dev/core"; import { _jsxSorted } from "@qwik.dev/core"; import { inlinedQrl } from "@qwik.dev/core"; import { useSignal } from '@qwik.dev/core'; -export const Works = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl((props)=>{ +export const Works = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl((_rawProps)=>{ let fromLocal = useSignal(0); return /*#__PURE__*/ _jsxSorted("div", null, null, [ fromLocal, - _wrapProp(props, "fromProps"), - _fnSignal((p0, p1)=>p0 + p1.fromProps, [ - fromLocal, - props - ], "p0+p1.fromProps"), + _wrapProp(_rawProps, "fromProps"), + _fnSignal((p0, p1)=>p1 + p0.fromProps, [ + _rawProps, + fromLocal + ], "p1+p0.fromProps"), _fnSignal((p0)=>({ props: p0.fromProps }), [ - props + _rawProps ], "{props:p0.fromProps}"), { local: fromLocal }, _fnSignal((p0, p1)=>({ - props: p1.fromProps, - local: p0 + props: p0.fromProps, + local: p1 }), [ - fromLocal, - props - ], "{props:p1.fromProps,local:p0}") + _rawProps, + fromLocal + ], "{props:p0.fromProps,local:p1}") ], 1, "u6_0"); }, "Works_component_t45qL4vNGv0")); diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_convert_rest_props.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_convert_rest_props.snap new file mode 100644 index 00000000000..3906767de29 --- /dev/null +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_convert_rest_props.snap @@ -0,0 +1,103 @@ +--- +source: packages/qwik/src/optimizer/core/src/test.rs +assertion_line: 4578 +expression: output +snapshot_kind: text +--- +==INPUT== + + + import { component$, useTask$ } from '@qwik.dev/core' + + export default component$(({ ...props }) => { + useTask$(() => { + props.checked + }) + + return 'hi' + }) + +============================= test.js == + +import { componentQrl } from "@qwik.dev/core"; +import { qrl } from "@qwik.dev/core"; +const i_LUXeXe0DQrg = ()=>import("./test.tsx_test_component_LUXeXe0DQrg"); +export default /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrl(i_LUXeXe0DQrg, "test_component_LUXeXe0DQrg")); + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;AAGE,6BAAe,6EAMb\"}") +============================= test.tsx_test_component_useTask_jewzFYh3XmQ.js (ENTRY POINT)== + +import { useLexicalScope } from "@qwik.dev/core"; +export const test_component_useTask_jewzFYh3XmQ = ()=>{ + const [props] = useLexicalScope(); + props.checked; +}; + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";kDAIW;;IACR,MAAM,OAAO\"}") +/* +{ + "origin": "test.tsx", + "name": "test_component_useTask_jewzFYh3XmQ", + "entry": null, + "displayName": "test.tsx_test_component_useTask", + "hash": "jewzFYh3XmQ", + "canonicalFilename": "test.tsx_test_component_useTask_jewzFYh3XmQ", + "path": "", + "extension": "js", + "parent": "test_component_LUXeXe0DQrg", + "ctxKind": "function", + "ctxName": "useTask$", + "captures": true, + "loc": [ + 123, + 151 + ], + "captureNames": [ + "props" + ] +} +*/ +============================= test.tsx_test_component_LUXeXe0DQrg.js (ENTRY POINT)== + +import { _restProps } from "@qwik.dev/core"; +import { qrl } from "@qwik.dev/core"; +import { useTaskQrl } from "@qwik.dev/core"; +const i_jewzFYh3XmQ = ()=>import("./test.tsx_test_component_useTask_jewzFYh3XmQ"); +export const test_component_LUXeXe0DQrg = (_rawProps)=>{ + const props = _restProps(_rawProps); + useTaskQrl(/*#__PURE__*/ qrl(i_jewzFYh3XmQ, "test_component_useTask_jewzFYh3XmQ", [ + props + ])); + return 'hi'; +}; + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;0CAGiC;;IAC/B;;;IAIA,OAAO;AACP\"}") +/* +{ + "origin": "test.tsx", + "name": "test_component_LUXeXe0DQrg", + "entry": null, + "displayName": "test.tsx_test_component", + "hash": "LUXeXe0DQrg", + "canonicalFilename": "test.tsx_test_component_LUXeXe0DQrg", + "path": "", + "extension": "js", + "parent": null, + "ctxKind": "function", + "ctxName": "component$", + "captures": false, + "loc": [ + 92, + 171 + ], + "paramNames": [ + "_rawProps" + ] +} +*/ +== DIAGNOSTICS == + +[] diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_destructure_args.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_destructure_args.snap index 9754d1a1023..b4708283199 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_destructure_args.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_destructure_args.snap @@ -45,8 +45,8 @@ import { _jsxSorted } from "@qwik.dev/core"; import { _jsxSplit } from "@qwik.dev/core"; import { _restProps } from "@qwik.dev/core"; import { _wrapProp } from "@qwik.dev/core"; -export const test_component_LUXeXe0DQrg = (props)=>{ - const rest = _restProps(props, [ +export const test_component_LUXeXe0DQrg = (_rawProps)=>{ + const rest = _restProps(_rawProps, [ "message", "id", "count" @@ -59,14 +59,14 @@ export const test_component_LUXeXe0DQrg = (props)=>{ renders.renders++; const rerenders = renders.renders + 0; return /*#__PURE__*/ _jsxSorted("div", { - id: _wrapProp(props, "id") + id: _wrapProp(_rawProps, "id") }, null, [ /*#__PURE__*/ _jsxSplit("span", { ..._getVarProps(rest) }, _getConstProps(rest), [ - _wrapProp(props, "message"), + _wrapProp(_rawProps, "message"), " ", - _wrapProp(props, "count") + _wrapProp(_rawProps, "count") ], 0, null), /*#__PURE__*/ _jsxSorted("div", null, { class: "renders" @@ -95,7 +95,7 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma 522 ], "paramNames": [ - "props" + "_rawProps" ] } */ diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_mark_props_as_var_props_for_inner_cmp.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_mark_props_as_var_props_for_inner_cmp.snap index 773ee122699..1f07643e919 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_mark_props_as_var_props_for_inner_cmp.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_mark_props_as_var_props_for_inner_cmp.snap @@ -105,14 +105,14 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma import { useLexicalScope } from "@qwik.dev/core"; import { serverImg } from "~/routes/(authenticated)/layout"; -export const ModelImg_component_imgLoc_useResource_Ogi9hEJvtmI = async (props)=>{ - const [props1] = useLexicalScope(); - props.track(()=>props1.store.model); +export const ModelImg_component_imgLoc_useResource_Ogi9hEJvtmI = async (_rawProps)=>{ + const [props] = useLexicalScope(); + _rawProps.track(()=>props.store.model); return await serverImg('some.png'); }; -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;iEAc8B;;IAC1B,MADmC,MAC7B,IAAM,OAAM,KAAK,CAAC,KAAK;IAC7B,OAAO,MAAM,UAAU\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;iEAc8B;;IAC1B,UADmC,MAC7B,IAAM,MAAM,KAAK,CAAC,KAAK;IAC7B,OAAO,MAAM,UAAU\"}") /* { "origin": "test.tsx", @@ -132,7 +132,7 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma 488 ], "paramNames": [ - "props" + "_rawProps" ], "captureNames": [ "props" diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_not_generate_conflicting_props_identifiers.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_not_generate_conflicting_props_identifiers.snap new file mode 100644 index 00000000000..ccf9513fbfa --- /dev/null +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_not_generate_conflicting_props_identifiers.snap @@ -0,0 +1,56 @@ +--- +source: packages/qwik/src/optimizer/core/src/test.rs +assertion_line: 4552 +expression: output +snapshot_kind: text +--- +==INPUT== + + + import { component$, useComputed$, useTask$ } from '@qwik.dev/core' + + export default component$(({ color, ...props }) => { + useComputed$(() => color) + + useTask$(() => { + props.checked + }) + + return 'hi' + }) + +============================= test.js == + +import { _restProps } from "@qwik.dev/core"; +import { componentQrl } from "@qwik.dev/core"; +import { useComputedQrl } from "@qwik.dev/core"; +import { useLexicalScope } from "@qwik.dev/core"; +import { inlinedQrl } from "@qwik.dev/core"; +import { useTaskQrl } from "@qwik.dev/core"; +const test_component_useComputed_PYU291PvidQ = ()=>{ + const [_rawProps] = useLexicalScope(); + return _rawProps.color; +}; +const test_component_useTask_jewzFYh3XmQ = ()=>{ + const [props] = useLexicalScope(); + props.checked; +}; +const test_component_LUXeXe0DQrg = (_rawProps)=>{ + const props = _restProps(_rawProps, [ + "color" + ]); + useComputedQrl(/*#__PURE__*/ inlinedQrl(test_component_useComputed_PYU291PvidQ, "test_component_useComputed_PYU291PvidQ", [ + _rawProps + ])); + useTaskQrl(/*#__PURE__*/ inlinedQrl(test_component_useTask_jewzFYh3XmQ, "test_component_useTask_jewzFYh3XmQ", [ + props + ])); + return 'hi'; +}; +export default /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl(test_component_LUXeXe0DQrg, "test_component_LUXeXe0DQrg")); + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;;+CAIe;;qBADgB;;2CAGpB;;IACR,MAAM,OAAO;;mCAJY;;;;IAC1B;;;IAEA;;;IAIA,OAAO;AACP;AARA,6BAAe,iGAQb\"}") +== DIAGNOSTICS == + +[] diff --git a/packages/qwik/src/optimizer/core/src/test.rs b/packages/qwik/src/optimizer/core/src/test.rs index 8341faf03db..7775cd14c74 100644 --- a/packages/qwik/src/optimizer/core/src/test.rs +++ b/packages/qwik/src/optimizer/core/src/test.rs @@ -4547,6 +4547,53 @@ fn should_split_spread_props_with_additional_prop5() { }); } +#[test] +fn should_not_generate_conflicting_props_identifiers() { + test_input!(TestInput { + code: r#" + import { component$, useComputed$, useTask$ } from '@qwik.dev/core' + + export default component$(({ color, ...props }) => { + useComputed$(() => color) + + useTask$(() => { + props.checked + }) + + return 'hi' + }) + "# + .to_string(), + transpile_ts: true, + transpile_jsx: true, + // important to use hoist entry strategy to test this case + // only in hoist mode there was an issue with conflicting props identifiers + entry_strategy: EntryStrategy::Hoist, + ..TestInput::default() + }); +} + +#[test] +fn should_convert_rest_props() { + test_input!(TestInput { + code: r#" + import { component$, useTask$ } from '@qwik.dev/core' + + export default component$(({ ...props }) => { + useTask$(() => { + props.checked + }) + + return 'hi' + }) + "# + .to_string(), + transpile_ts: true, + transpile_jsx: true, + ..TestInput::default() + }); +} + // TODO(misko): Make this test work by implementing strict serialization. // #[test] // fn example_of_synchronous_qrl_that_cant_be_serialized() {