Files
dioxus/packages/depinfo/src/lib.rs
T
Jonathan Kelley d976ca184a Binary patching rust hot-reloading, sub-second rebuilds, independent server/client hot-reload (#3797)
Enable runtime rust hot patching.

* roll back wry to 0.45

* cleanup rustc

* wip

* wip: fix client/server

* get the subsecond cli thing working again

* back to list of builds but with accessors

* migrate some methods to workspace, clean up impl a bit

* pass mode through build context

* use a build context, similar to cargo/rustc

* merge BuildUpdate and HandleUpdate into BuilderUpdate

* Move more resolution of args into runner

* migrate some methods to runner

* hoist out fullstack

* fix build request resolver

* yay request is cleaned up

* fixup resolution a bit

* spawn off the build!

* re-wire android autodetection

* re-wire android autodetection

* wire back up a few more things

* re-wire tooling verification

* I think it's mostly in the right condition for regular app

* add depinfo parser

* yay okay works with regular apps again

* full rebuilds are back

* rewire file wtcher

* wire patch!

* yayyyyyy patching works and is really fast

* yay android works

* clean up stdout piping

* yayyy memap on android so we don't need root

* create a static wasm jump table

* wip: global offset table for wasm

* wip... thinking about making the patches relocatable

* wip: customized relocation

* YESSSSSS RELOCATABLE WASM

* clean up impl a bit

* lil bit more cleanup

* lil bit more

* lil bit more cleanup

* lil bit more cleanup, support 32 bit platforms

* sick, wasm is completely pic

* hmmmm not quite working yet

* woooo, patches loading from rust+wasm

* integrated into the cli 😎

* condense a bit

* cleaned up request a bit

* bust fingerprints

* Make the file diffing logic a bit more sensible

* still working through a few issues, server launches but is acting weird

* fix merge conflict

* more merge issues

* remove stuff we don't want anymore

* revert name change

* wip: server not working anymore :(

* split apart "dioxus fullstack" into "dioxus server" and "dioxus web"

* fixup a few more compile errors

* grrr opening server

* simultaneous frontend and backend patching

* use rustc wrapper

* wip: passing assets to jumptable

* migrate project-like examples

* patchy  patchy server fns!

* rollback some random changes

* unwind the js files

* rollback hash

* no need for patch

* more cleanups

* lil bit more cleanup, remove some old cruft

* allow patching when wasm webpage is closed

* tiny bit more robust

* lil bit of clean up

* clean up ws code

* bit more clean ups

* condense

* undo file moves

* move back other project

* move other project

* migrate out harness and janky CLI

* fix compile

* anonymize some files, heavily document others

* lots more documentation, for posterity!

* ton more docs

* clean up the cli a bit more

* more ws cleanup

* more cleanup

* migrate build id to cli-config

* add command file handling

* random small cleanups

* wip....

* wip....

* fix: use workspace for krate discovery

* fix panic logging on serve by placing it *after* the logs

* reorder logging to be sensible on success

* bring back swc

* ws cruft

* small patches to relocs in loader

* bump krates

* hoist main funcs into the ifunc table, fixing wasm

* fix tui output for long lines

* add more linker logging

* wow, incredible, we build fat binaries, holy heckkkkk

* fix args for frontend/backend

* small cleanups

* properly send along build IDs to clients

* fix workspace compiles

* clean up jump table work a bit

* clean up logging a bit

* open existing

* fixup some commands

* open existing browser integration

* wire up the new dx serve client/server syntax

* fixup `dx run` command

* bring back some old functionality

* fix serverfn feature sets

* remove toast animation and simplify its code a bit

* less intrusive toast

* dont change build status when patching on web

* add proper cache busting to vcomponent

* clean up the patch file a bit

* more lints/checks cleaned up

* go back to TargetArgs but a BuildTargets resolved struct

* clean up more nits

* use an atomicptr for jumptable

* fix interaction with initial web load + suspense

* don't run asset system on wasm/bindgen js in dev

* reduce blast radius of PR

* use profile to determine if we're in release

* cleanup prod html template

* cleanup profiles

* fix feature resolution of fullstack

* if fullstack is explicitly false, don't use it

* light cleanups

* drop carg config2

* pass along linker args properly

* make workspace examples compile with dx again

* fewer unwraps and better error loggign

* bit more error handlign

* small cleanup

* drive-by cleanups

* use queries instead of initialize for aslr stuff

* fix hotpatch with higher opt level

* fix aslr bug from multiple clients

* fix merge conflict

* fix typos

* clippy

* fix miscompile

* fix doctest

* properly rollback wry to 0.45

* fix markdown path issues, other test issues

* fix test in router

* fix release mode test

* fix some more tests, clean up a few more items

* use fnptr instead of typeid

* clean up memozation via subsecond in core

* use "main" as sentinel

* fix imports and re-exports

* get off __rust_alloc for aslr offset detection

* wip

* wip... fixing unoptimized web

* hmmmm mmmm

* close,ish, still missing the wasmbindgen dynaimc imports

* aha! full wasm works now

- disable externref when compilng patch modules
- manually link wasm instrinsics
- displace the __wbindgen_placeholder__ table with the synthesized wbg imports

what an awful pain.

There might be a few items missing, so will test against the docsite shortly

* remove failing test

* hmmmm things aren't perfect

* from what I can tell, relocatable wasm just doesn't work with wasm-bindgen

sad

https://github.com/rustwasm/wasm-bindgen/issues/1420

* AI IS LITERALLY THE WORST

* preserve wasm snippets across compiles

* IT HOTPATCHES THE DOCSITE, WE ARE LIVING IN THE FUTURE

* remove the macos cfg-out

* fix: need to allocate 1 more page

* fix url issue

* properly span props

* properly fill in extra symbols

* light cleanups and good docs

* delete cruft, better docs

* More cleanups and simplifications

* clippy, typos

* remove harnesses

* wasm-bindgen error logging

* clean up deps

* remove cruft

* proper priv/pub

* use ifuncs for all env imports

* cruft

* use par_iter, better output

* implement a cache for the base module

* delete custom sections

* cache the main native module too

* add par iter in a few more places

* clippy, map ident

* better logging and status bars

* wip: some small windows support

* wip more windowss

* fix weird regression

* implement windows jump table

* small fixes for windows

* better windows support

* windows support pt2

* rust lld is not msvc

* whole archive the rlibs

* ignore windows and sys crates

* logging

* ohhhhhh, pop out dlls

* dedupe

* thANK GOD FAT LINKING WORKS ON WINDOWS

* hoist caching

* implement patch based on cache

* fix location for pdb

* pass data symbols, correct object

* add all symbol for windows

* add log

* treat none rva as undefined

* whoops

* handle windows calling convention

* dont use relocated arm64 stub windows

* not all are text?

* WINDOWS FUNCTION PATCHING WORKS

but issue with statics?

* use our own entry

* handle windows imp symbols

* add log

* jump to the real symbol not the layout

* whoops

* hotpatching windows works completely holy heck yay

* drop linker args crate

* disable ssg playwright for now

* light cleanups

* some cleanups / preps:
- bump to serverfn 0.8.2
- fix playwright test
- fix clippy

* use fix from #4042

* bring in other fix for liveview

* hoist some configuration

* use __aslr_reference instead of aslr_reference

* add better errors to patcherror

* fix android

* panic if patching fails

* clean up tomls

* wip: fixing wasm compile for server

* fullstack wasm again

* fix cfg

* fixup feature detection

* fix issue with features

* fix playwright!

* add barebones template test harness

* fix compatibility between the two hotreload engines

* fix preldue of server

* fix check for wasm-opt

* small fixes
2025-05-06 23:08:59 -07:00

440 lines
22 KiB
Rust

//! Parse the output of rustc's `.d` dep-info file.
//!
//! Used by the hot-reloading engine and other libraries to provide higher quality dependency analysis
//! for the user's project.
use std::path::PathBuf;
#[non_exhaustive]
#[derive(Debug, thiserror::Error)]
pub enum DepInfoParseError {
/// The input was malformed - maybe this `.d` format is no longer supported?
#[error("Malformed input")]
MalformedInput,
/// An env var could not be escaped or parsed - this might be a bug in rustc.
#[error("Failed to parse env var name")]
InvalidEnvVarName,
}
#[non_exhaustive]
#[derive(Default, Debug)]
pub struct RustcDepInfo {
/// The list of files that the main target in the dep-info file depends on.
pub files: Vec<PathBuf>,
/// The list of environment variables we found that the rustc compilation
/// depends on.
///
/// The first element of the pair is the name of the env var and the second
/// item is the value. `Some` means that the env var was set, and `None`
/// means that the env var wasn't actually set and the compilation depends
/// on it not being set.
pub env: Vec<(String, Option<String>)>,
}
impl std::str::FromStr for RustcDepInfo {
type Err = DepInfoParseError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Self::new(s)
}
}
impl RustcDepInfo {
/// Parse the `.d` dep-info file generated by rustc.
pub fn new(contents: &str) -> Result<RustcDepInfo, DepInfoParseError> {
let mut ret = RustcDepInfo::default();
let mut found_deps = false;
for line in contents.lines() {
if let Some(rest) = line.strip_prefix("# env-dep:") {
let mut parts = rest.splitn(2, '=');
let env_var = match parts.next() {
Some(s) => s,
None => continue,
};
let env_val = match parts.next() {
Some(s) => Some(unescape_env(s)?),
None => None,
};
ret.env.push((unescape_env(env_var)?, env_val));
} else if let Some(pos) = line.find(": ") {
if found_deps {
continue;
}
found_deps = true;
let mut deps = line[pos + 2..].split_whitespace();
while let Some(s) = deps.next() {
let mut file = s.to_string();
while file.ends_with('\\') {
file.pop();
file.push(' ');
file.push_str(deps.next().ok_or(DepInfoParseError::MalformedInput)?);
}
ret.files.push(file.into());
}
}
}
return Ok(ret);
// rustc tries to fit env var names and values all on a single line, which
// means it needs to escape `\r` and `\n`. The escape syntax used is "\n"
// which means that `\` also needs to be escaped.
fn unescape_env(s: &str) -> Result<String, DepInfoParseError> {
let mut ret = String::with_capacity(s.len());
let mut chars = s.chars();
while let Some(c) = chars.next() {
if c != '\\' {
ret.push(c);
continue;
}
match chars.next() {
Some('\\') => ret.push('\\'),
Some('n') => ret.push('\n'),
Some('r') => ret.push('\r'),
Some(_) => return Err(DepInfoParseError::InvalidEnvVarName),
None => return Err(DepInfoParseError::InvalidEnvVarName),
}
}
Ok(ret)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_from_path() {
let contents = include_str!("./dx.d");
let info: RustcDepInfo = contents.parse().unwrap();
let answer = vec![
"/dioxus/packages/autofmt/README.md",
"/dioxus/packages/autofmt/src/buffer.rs",
"/dioxus/packages/autofmt/src/collect_macros.rs",
"/dioxus/packages/autofmt/src/indent.rs",
"/dioxus/packages/autofmt/src/lib.rs",
"/dioxus/packages/autofmt/src/prettier_please.rs",
"/dioxus/packages/autofmt/src/writer.rs",
"/dioxus/packages/check/README.md",
"/dioxus/packages/check/src/check.rs",
"/dioxus/packages/check/src/issues.rs",
"/dioxus/packages/check/src/lib.rs",
"/dioxus/packages/check/src/metadata.rs",
"/dioxus/packages/cli/README.md",
"/dioxus/packages/cli/assets/android/MainActivity.kt.hbs",
"/dioxus/packages/cli/assets/android/gen/app/build.gradle.kts.hbs",
"/dioxus/packages/cli/assets/android/gen/app/proguard-rules.pro",
"/dioxus/packages/cli/assets/android/gen/app/src/main/AndroidManifest.xml.hbs",
"/dioxus/packages/cli/assets/android/gen/app/src/main/res/drawable/ic_launcher_background.xml",
"/dioxus/packages/cli/assets/android/gen/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
"/dioxus/packages/cli/assets/android/gen/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
"/dioxus/packages/cli/assets/android/gen/app/src/main/res/mipmap-hdpi/ic_launcher.webp",
"/dioxus/packages/cli/assets/android/gen/app/src/main/res/mipmap-mdpi/ic_launcher.webp",
"/dioxus/packages/cli/assets/android/gen/app/src/main/res/mipmap-xhdpi/ic_launcher.webp",
"/dioxus/packages/cli/assets/android/gen/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp",
"/dioxus/packages/cli/assets/android/gen/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp",
"/dioxus/packages/cli/assets/android/gen/app/src/main/res/values/colors.xml",
"/dioxus/packages/cli/assets/android/gen/app/src/main/res/values/strings.xml.hbs",
"/dioxus/packages/cli/assets/android/gen/app/src/main/res/values/styles.xml",
"/dioxus/packages/cli/assets/android/gen/build.gradle.kts",
"/dioxus/packages/cli/assets/android/gen/gradle/wrapper/gradle-wrapper.jar",
"/dioxus/packages/cli/assets/android/gen/gradle/wrapper/gradle-wrapper.properties",
"/dioxus/packages/cli/assets/android/gen/gradle.properties",
"/dioxus/packages/cli/assets/android/gen/gradlew",
"/dioxus/packages/cli/assets/android/gen/gradlew.bat",
"/dioxus/packages/cli/assets/android/gen/settings.gradle",
"/dioxus/packages/cli/assets/dioxus.toml",
"/dioxus/packages/cli/assets/ios/ios.plist.hbs",
"/dioxus/packages/cli/assets/macos/mac.plist.hbs",
"/dioxus/packages/cli/assets/web/index.html",
"/dioxus/packages/cli/assets/web/loading.html",
"/dioxus/packages/cli/assets/web/toast.html",
"/dioxus/packages/cli/build.rs",
"/dioxus/packages/cli/src/build/builder.rs",
"/dioxus/packages/cli/src/build/bundle.rs",
"/dioxus/packages/cli/src/build/mod.rs",
"/dioxus/packages/cli/src/build/prerender.rs",
"/dioxus/packages/cli/src/build/progress.rs",
"/dioxus/packages/cli/src/build/request.rs",
"/dioxus/packages/cli/src/build/templates.rs",
"/dioxus/packages/cli/src/build/verify.rs",
"/dioxus/packages/cli/src/build/web.rs",
"/dioxus/packages/cli/src/bundle_utils.rs",
"/dioxus/packages/cli/src/cli/autoformat.rs",
"/dioxus/packages/cli/src/cli/build.rs",
"/dioxus/packages/cli/src/cli/bundle.rs",
"/dioxus/packages/cli/src/cli/check.rs",
"/dioxus/packages/cli/src/cli/clean.rs",
"/dioxus/packages/cli/src/cli/config.rs",
"/dioxus/packages/cli/src/cli/create.rs",
"/dioxus/packages/cli/src/cli/init.rs",
"/dioxus/packages/cli/src/cli/link.rs",
"/dioxus/packages/cli/src/cli/mod.rs",
"/dioxus/packages/cli/src/cli/run.rs",
"/dioxus/packages/cli/src/cli/serve.rs",
"/dioxus/packages/cli/src/cli/target.rs",
"/dioxus/packages/cli/src/cli/translate.rs",
"/dioxus/packages/cli/src/cli/verbosity.rs",
"/dioxus/packages/cli/src/config/app.rs",
"/dioxus/packages/cli/src/config/bundle.rs",
"/dioxus/packages/cli/src/config/desktop.rs",
"/dioxus/packages/cli/src/config/dioxus_config.rs",
"/dioxus/packages/cli/src/config/serve.rs",
"/dioxus/packages/cli/src/config/web.rs",
"/dioxus/packages/cli/src/config.rs",
"/dioxus/packages/cli/src/dioxus_crate.rs",
"/dioxus/packages/cli/src/dx_build_info.rs",
"/dioxus/packages/cli/src/error.rs",
"/dioxus/packages/cli/src/fastfs.rs",
"/dioxus/packages/cli/src/filemap.rs",
"/dioxus/packages/cli/src/logging.rs",
"/dioxus/packages/cli/src/main.rs",
"/dioxus/packages/cli/src/metadata.rs",
"/dioxus/packages/cli/src/platform.rs",
"/dioxus/packages/cli/src/rustc.rs",
"/dioxus/packages/cli/src/serve/ansi_buffer.rs",
"/dioxus/packages/cli/src/serve/detect.rs",
"/dioxus/packages/cli/src/serve/handle.rs",
"/dioxus/packages/cli/src/serve/mod.rs",
"/dioxus/packages/cli/src/serve/output.rs",
"/dioxus/packages/cli/src/serve/proxy.rs",
"/dioxus/packages/cli/src/serve/runner.rs",
"/dioxus/packages/cli/src/serve/server.rs",
"/dioxus/packages/cli/src/serve/update.rs",
"/dioxus/packages/cli/src/serve/watcher.rs",
"/dioxus/packages/cli/src/settings.rs",
"/dioxus/packages/cli/src/wasm_bindgen.rs",
"/dioxus/packages/cli-config/src/lib.rs",
"/dioxus/packages/cli-opt/src/css.rs",
"/dioxus/packages/cli-opt/src/file.rs",
"/dioxus/packages/cli-opt/src/folder.rs",
"/dioxus/packages/cli-opt/src/image/jpg.rs",
"/dioxus/packages/cli-opt/src/image/mod.rs",
"/dioxus/packages/cli-opt/src/image/png.rs",
"/dioxus/packages/cli-opt/src/js.rs",
"/dioxus/packages/cli-opt/src/json.rs",
"/dioxus/packages/cli-opt/src/lib.rs",
"/dioxus/packages/config-macro/README.md",
"/dioxus/packages/config-macro/src/lib.rs",
"/dioxus/packages/const-serialize/README.md",
"/dioxus/packages/const-serialize/src/const_buffers.rs",
"/dioxus/packages/const-serialize/src/const_vec.rs",
"/dioxus/packages/const-serialize/src/lib.rs",
"/dioxus/packages/const-serialize-macro/src/lib.rs",
"/dioxus/packages/core/README.md",
"/dioxus/packages/core/docs/common_spawn_errors.md",
"/dioxus/packages/core/docs/reactivity.md",
"/dioxus/packages/core/src/any_props.rs",
"/dioxus/packages/core/src/arena.rs",
"/dioxus/packages/core/src/diff/component.rs",
"/dioxus/packages/core/src/diff/iterator.rs",
"/dioxus/packages/core/src/diff/mod.rs",
"/dioxus/packages/core/src/diff/node.rs",
"/dioxus/packages/core/src/effect.rs",
"/dioxus/packages/core/src/error_boundary.rs",
"/dioxus/packages/core/src/events.rs",
"/dioxus/packages/core/src/fragment.rs",
"/dioxus/packages/core/src/generational_box.rs",
"/dioxus/packages/core/src/global_context.rs",
"/dioxus/packages/core/src/hotreload_utils.rs",
"/dioxus/packages/core/src/launch.rs",
"/dioxus/packages/core/src/lib.rs",
"/dioxus/packages/core/src/mutations.rs",
"/dioxus/packages/core/src/nodes.rs",
"/dioxus/packages/core/src/properties.rs",
"/dioxus/packages/core/src/reactive_context.rs",
"/dioxus/packages/core/src/render_error.rs",
"/dioxus/packages/core/src/root_wrapper.rs",
"/dioxus/packages/core/src/runtime.rs",
"/dioxus/packages/core/src/scheduler.rs",
"/dioxus/packages/core/src/scope_arena.rs",
"/dioxus/packages/core/src/scope_context.rs",
"/dioxus/packages/core/src/scopes.rs",
"/dioxus/packages/core/src/suspense/component.rs",
"/dioxus/packages/core/src/suspense/mod.rs",
"/dioxus/packages/core/src/tasks.rs",
"/dioxus/packages/core/src/virtual_dom.rs",
"/dioxus/packages/core-macro/README.md",
"/dioxus/packages/core-macro/docs/component.md",
"/dioxus/packages/core-macro/docs/props.md",
"/dioxus/packages/core-macro/docs/rsx.md",
"/dioxus/packages/core-macro/src/component.rs",
"/dioxus/packages/core-macro/src/lib.rs",
"/dioxus/packages/core-macro/src/props/mod.rs",
"/dioxus/packages/core-macro/src/utils.rs",
"/dioxus/packages/core-types/src/bubbles.rs",
"/dioxus/packages/core-types/src/bundled.rs",
"/dioxus/packages/core-types/src/formatter.rs",
"/dioxus/packages/core-types/src/hr_context.rs",
"/dioxus/packages/core-types/src/lib.rs",
"/dioxus/packages/devtools/src/lib.rs",
"/dioxus/packages/devtools-types/src/lib.rs",
"/dioxus/packages/dioxus-lib/README.md",
"/dioxus/packages/dioxus-lib/src/lib.rs",
"/dioxus/packages/document/build.rs",
"/dioxus/packages/document/docs/eval.md",
"/dioxus/packages/document/docs/head.md",
"/dioxus/packages/document/src/document.rs",
"/dioxus/packages/document/src/elements/link.rs",
"/dioxus/packages/document/src/elements/meta.rs",
"/dioxus/packages/document/src/elements/mod.rs",
"/dioxus/packages/document/src/elements/script.rs",
"/dioxus/packages/document/src/elements/style.rs",
"/dioxus/packages/document/src/elements/stylesheet.rs",
"/dioxus/packages/document/src/elements/title.rs",
"/dioxus/packages/document/src/error.rs",
"/dioxus/packages/document/src/eval.rs",
"/dioxus/packages/document/src/js/head.js",
"/dioxus/packages/document/src/lib.rs",
"/dioxus/packages/document/./src/ts/eval.ts",
"/dioxus/packages/document/./src/ts/head.ts",
"/dioxus/packages/dx-wire-format/src/lib.rs",
"/dioxus/packages/fullstack/README.md",
"/dioxus/packages/fullstack/src/document/mod.rs",
"/dioxus/packages/fullstack/src/hooks/mod.rs",
"/dioxus/packages/fullstack/src/hooks/server_cached.rs",
"/dioxus/packages/fullstack/src/hooks/server_future.rs",
"/dioxus/packages/fullstack/src/html_storage/mod.rs",
"/dioxus/packages/fullstack/src/lib.rs",
"/dioxus/packages/generational-box/README.md",
"/dioxus/packages/generational-box/src/entry.rs",
"/dioxus/packages/generational-box/src/error.rs",
"/dioxus/packages/generational-box/src/lib.rs",
"/dioxus/packages/generational-box/src/references.rs",
"/dioxus/packages/generational-box/src/sync.rs",
"/dioxus/packages/generational-box/src/unsync.rs",
"/dioxus/packages/history/src/lib.rs",
"/dioxus/packages/history/src/memory.rs",
"/dioxus/packages/hooks/README.md",
"/dioxus/packages/hooks/docs/derived_state.md",
"/dioxus/packages/hooks/docs/moving_state_around.md",
"/dioxus/packages/hooks/docs/rules_of_hooks.md",
"/dioxus/packages/hooks/docs/side_effects.md",
"/dioxus/packages/hooks/docs/use_resource.md",
"/dioxus/packages/hooks/src/lib.rs",
"/dioxus/packages/hooks/src/use_callback.rs",
"/dioxus/packages/hooks/src/use_context.rs",
"/dioxus/packages/hooks/src/use_coroutine.rs",
"/dioxus/packages/hooks/src/use_effect.rs",
"/dioxus/packages/hooks/src/use_future.rs",
"/dioxus/packages/hooks/src/use_hook_did_run.rs",
"/dioxus/packages/hooks/src/use_memo.rs",
"/dioxus/packages/hooks/src/use_on_destroy.rs",
"/dioxus/packages/hooks/src/use_reactive.rs",
"/dioxus/packages/hooks/src/use_resource.rs",
"/dioxus/packages/hooks/src/use_root_context.rs",
"/dioxus/packages/hooks/src/use_set_compare.rs",
"/dioxus/packages/hooks/src/use_signal.rs",
"/dioxus/packages/html/README.md",
"/dioxus/packages/html/docs/common_event_handler_errors.md",
"/dioxus/packages/html/docs/event_handlers.md",
"/dioxus/packages/html/src/attribute_groups.rs",
"/dioxus/packages/html/src/elements.rs",
"/dioxus/packages/html/src/events/animation.rs",
"/dioxus/packages/html/src/events/clipboard.rs",
"/dioxus/packages/html/src/events/composition.rs",
"/dioxus/packages/html/src/events/drag.rs",
"/dioxus/packages/html/src/events/focus.rs",
"/dioxus/packages/html/src/events/form.rs",
"/dioxus/packages/html/src/events/image.rs",
"/dioxus/packages/html/src/events/keyboard.rs",
"/dioxus/packages/html/src/events/media.rs",
"/dioxus/packages/html/src/events/mod.rs",
"/dioxus/packages/html/src/events/mounted.rs",
"/dioxus/packages/html/src/events/mouse.rs",
"/dioxus/packages/html/src/events/pointer.rs",
"/dioxus/packages/html/src/events/resize.rs",
"/dioxus/packages/html/src/events/scroll.rs",
"/dioxus/packages/html/src/events/selection.rs",
"/dioxus/packages/html/src/events/toggle.rs",
"/dioxus/packages/html/src/events/touch.rs",
"/dioxus/packages/html/src/events/transition.rs",
"/dioxus/packages/html/src/events/visible.rs",
"/dioxus/packages/html/src/events/wheel.rs",
"/dioxus/packages/html/src/file_data.rs",
"/dioxus/packages/html/src/geometry.rs",
"/dioxus/packages/html/src/input_data.rs",
"/dioxus/packages/html/src/lib.rs",
"/dioxus/packages/html/src/point_interaction.rs",
"/dioxus/packages/html/src/render_template.rs",
"/dioxus/packages/html-internal-macro/src/lib.rs",
"/dioxus/packages/lazy-js-bundle/src/lib.rs",
"/dioxus/packages/manganis/manganis/README.md",
"/dioxus/packages/manganis/manganis/src/hash.rs",
"/dioxus/packages/manganis/manganis/src/lib.rs",
"/dioxus/packages/manganis/manganis/src/macro_helpers.rs",
"/dioxus/packages/manganis/manganis-core/src/asset.rs",
"/dioxus/packages/manganis/manganis-core/src/css.rs",
"/dioxus/packages/manganis/manganis-core/src/folder.rs",
"/dioxus/packages/manganis/manganis-core/src/hash.rs",
"/dioxus/packages/manganis/manganis-core/src/images.rs",
"/dioxus/packages/manganis/manganis-core/src/js.rs",
"/dioxus/packages/manganis/manganis-core/src/lib.rs",
"/dioxus/packages/manganis/manganis-core/src/linker.rs",
"/dioxus/packages/manganis/manganis-core/src/options.rs",
"/dioxus/packages/manganis/manganis-macro/README.md",
"/dioxus/packages/manganis/manganis-macro/src/asset.rs",
"/dioxus/packages/manganis/manganis-macro/src/lib.rs",
"/dioxus/packages/manganis/manganis-macro/src/linker.rs",
"/dioxus/packages/rsx/src/assign_dyn_ids.rs",
"/dioxus/packages/rsx/src/attribute.rs",
"/dioxus/packages/rsx/src/component.rs",
"/dioxus/packages/rsx/src/diagnostics.rs",
"/dioxus/packages/rsx/src/element.rs",
"/dioxus/packages/rsx/src/expr_node.rs",
"/dioxus/packages/rsx/src/forloop.rs",
"/dioxus/packages/rsx/src/ifchain.rs",
"/dioxus/packages/rsx/src/ifmt.rs",
"/dioxus/packages/rsx/src/lib.rs",
"/dioxus/packages/rsx/src/literal.rs",
"/dioxus/packages/rsx/src/location.rs",
"/dioxus/packages/rsx/src/node.rs",
"/dioxus/packages/rsx/src/partial_closure.rs",
"/dioxus/packages/rsx/src/raw_expr.rs",
"/dioxus/packages/rsx/src/rsx_block.rs",
"/dioxus/packages/rsx/src/rsx_call.rs",
"/dioxus/packages/rsx/src/template_body.rs",
"/dioxus/packages/rsx/src/text_node.rs",
"/dioxus/packages/rsx/src/util.rs",
"/dioxus/packages/rsx-hotreload/src/collect.rs",
"/dioxus/packages/rsx-hotreload/src/diff.rs",
"/dioxus/packages/rsx-hotreload/src/extensions.rs",
"/dioxus/packages/rsx-hotreload/src/last_build_state.rs",
"/dioxus/packages/rsx-hotreload/src/lib.rs",
"/dioxus/packages/rsx-rosetta/README.md",
"/dioxus/packages/rsx-rosetta/src/lib.rs",
"/dioxus/packages/server-macro/src/lib.rs",
"/dioxus/packages/signals/README.md",
"/dioxus/packages/signals/docs/hoist/error.rs",
"/dioxus/packages/signals/docs/hoist/fixed_list.rs",
"/dioxus/packages/signals/docs/memo.md",
"/dioxus/packages/signals/docs/signals.md",
"/dioxus/packages/signals/src/copy_value.rs",
"/dioxus/packages/signals/src/global/memo.rs",
"/dioxus/packages/signals/src/global/mod.rs",
"/dioxus/packages/signals/src/global/signal.rs",
"/dioxus/packages/signals/src/impls.rs",
"/dioxus/packages/signals/src/lib.rs",
"/dioxus/packages/signals/src/map.rs",
"/dioxus/packages/signals/src/memo.rs",
"/dioxus/packages/signals/src/props.rs",
"/dioxus/packages/signals/src/read.rs",
"/dioxus/packages/signals/src/read_only_signal.rs",
"/dioxus/packages/signals/src/set_compare.rs",
"/dioxus/packages/signals/src/signal.rs",
"/dioxus/packages/signals/src/warnings.rs",
"/dioxus/packages/signals/src/write.rs",
"/dioxus/target/debug/build/dioxus-cli-90993e55e02b7cee/out/built.rs",
];
assert_eq!(
answer.iter().map(PathBuf::from).collect::<Vec<_>>(),
info.files
);
}
}