Giter VIP home page Giter VIP logo

perseus's People

Contributors

afidegnum avatar afiqzx avatar arctic-hen7 avatar asha20 avatar dependabot[bot] avatar ezesundayeze avatar floric avatar gladion136 avatar glendc avatar imbolc avatar iraiko avatar isaactay avatar jt117 avatar lukechu10 avatar marienz avatar mazwak avatar mhfan avatar miroito avatar mwcz avatar nicompte avatar niklasei avatar njittam avatar otsobear avatar phaleth avatar primeagen-rustaceans avatar ryanrussell avatar saona-raimundo avatar spirarel avatar wingertge avatar xtekc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

perseus's Issues

Add testing systems/docs

Is your feature request related to a problem? Please describe.
Currently, wasm-bindgen-test isn't really designed for testing a large, integrated system like Perseus, and there's right now basically no suitable tool for testing Rust web apps. If this could be integrated into Perseus, that would be amazing.

Describe the solution you'd like
A new command perseus test that runs your app as normal, but injects an extra Wasm script in that the user controls, allowing them to run arbitrary testing code and assertions that certain elements exist, etc.

Describe alternatives you've considered
wasm-bindgen-test, but that's not designed for going to a local site and working with it.

Additional context
Add any other context or screenshots about the feature request here.

Improve metadata modification

Currently, metadata modification is purely client-side rendered in initial loads, but this could be improved by rendering the <head> on the server and serving it as part of the PageData sent to the client. This would completely eliminate the need to render it on the client, as the static string could be interpolated directly. This would also avoid the current lag in updating the metadata, which occurs after the translator is available (whereas the content is interpolated beforehand).

Metadata modification

Right now, modifying the <head> in Perseus is pretty painful, and it needs to be done directly with web_sys. Especially in light of #2, Perseus should support a new property on a Template<G> that creates a Sycamore template for the document head. That should then be rendered to a string and interpolated directly into the head after any existing elements there.

This allows the user greater flexibility, and also allows the definition of universal properties on the <head>, which will be delimited from ones that are added with interpolation by a delimiter comment injected on the server-side.

copy to clipboard oddity in hello world tutorial

Describe the bug
I'm following the hello world tutorial and noticed something seems to be amiss with the copy to clipboard functionality. There may be weirdness with copy-to-clipboard in other parts of the docs; I didn't do an exhaustive check.

To Reproduce
Steps to reproduce the behavior:

  1. Go to https://arctic-hen7.github.io/perseus/hello-world.html
  2. Click on the "copy to clipboard" button for the src/lib.rs content
  3. Paste it into a text editor/area somewhere
  4. See that the code visible on the page is now wrapped with allow unused, and fn main

Expected behavior
Copy to clipboard copies the visible code.

Screenshots

Here's a recording.

Peek.2021-10-05.14-38.mp4

Environment (please complete the following information):

  • Perseus Version: N/A
  • Sycamore Version: N/A
  • OS: Fedora 34
  • Browser: Chrome
  • Browser Version: 94

Ergonomic Improvements for `perseus::template::Template`

Is your feature request related to a problem? Please describe.
The current way of defining a template is somewhat boilerplate heavy (taken from https://arctic-hen7.github.io/perseus/en-US/docs/0.3.x/templates/intro):

use perseus::Template;
use std::rc::Rc;
use sycamore::prelude::{component, template, GenericNode, Template as SycamoreTemplate};

#[component(AboutPage<G>)]
pub fn about_page() -> SycamoreTemplate<G> {
    template! {
        p { "About." }
    }
}

pub fn get_template<G: GenericNode>() -> Template<G> {
    Template::new("about")
        .template(Rc::new(|_| {
            template! {
                AboutPage()
            }
        }))
        .head(Rc::new(|_| {
            template! {
                title { "About Page | Perseus Example – Basic" }
            }
        }))
}

Describe the solution you'd like
A simple way of slightly improving this would be to get rid of the Rc::news by accepting a impl Fn(Option<String>) instead.

Another possible solution would be to add the ability to set a component as the template function. Something like:

Template::new(...).component::<AboutPage<_>>()

Describe alternatives you've considered
Leave it the way it is

Router not executed on page changes

This is a tracking issues for a series of bugs in Perseus related to the custom routing systems.

  • Locale detection routes to blank page that only renders on reload, going back triggers panic
  • Clicking a link will do nothing, panicking in the background, but it works the second time

These bugs are all to do with the way Sycamore currently handles its ContextProvider system (detailed here), and they should all be fixed by this PR in Sycamore, which will be released shortly with Sycamore v0.6.0.

After that, those updates will be integrated into Perseus for v0.2.0, and this issue should then be closable. This primarily exists to forewarn anyone who has decided to compile the main branch and is experiencing these issues.

`bundle.wasm` has the same size when bundled with `--release` flag

Describe the bug
Tried to run perseus serve and then perseus serve --release and observed that the bundle.wasm, as loaded into the web browser, has the same size in both cases. Other than that running the command with the --release flag takes significantly longer.

To Reproduce
The following example results in bundle.wasm size of 329.28 KB.

Cargo.toml

[package]
name = "perseus-tiny"
version = "0.1.0"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
perseus = "0.3.0-beta.6"
sycamore = "0.6"
wee_alloc = "0.4"

[profile.release]
# Do not perform backtrace for panic on release builds.
panic = 'abort'
# Perform optimizations on all codegen units.
codegen-units = 1
# Optimize for size.
opt-level = 's' # 's' or 'z' to optimize "aggressively" for size
# Enable link time optimization. Does not work with Netlify.
lto = true

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Perseus Example – Tiny</title>
    <link data-trunk rel="rust" data-wasm-opt="s" />
</head>

<body>
    <div id="root"></div>
</body>

</html>

src/lib.rs

#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

use perseus::{define_app, ErrorPages, Template};
use std::rc::Rc;
use sycamore::template;
define_app! {
    templates: [
        Template::<G>::new("index").template(Rc::new(|_| {
            template! {
                p { "Hello World!!" }
            }
        }))
    ],
    error_pages: ErrorPages::new(Rc::new(|url, status, err, _| {
        template! {
            p { (format!("An error with HTTP code {} occurred at '{}': '{}'.", status, url, err)) }
        }
    }))
}

Expected behavior
After running perseus serve --release the bundle.wasm should be significantly smaller.

Screenshots
image

Environment (please complete the following information):

  • Perseus Version: 0.3.0-beta.6
  • Sycamore Version: 0.6.1
  • OS: debian 10
  • Browser: Firefox
  • Browser Version: 78.14.0esr (64-bit)

Additional context
Not really sure if the above is the correct way to bundle for production.

Perseus demo

Is your feature request related to a problem? Please describe.
There's currently no demo of Perseus in action, which makes getting reliable Lighthouse scores difficult, and a demo would improve engagement and show people what Perseus is really capable of!

Describe the solution you'd like
Deploying each of the examples would be problematic right now because some can't be hosted on modern providers like Netlify yet, so I think there are two options really available. The first is to rebuild the documentation as a Perseus app and export it statically on GitHub Pages, and the second is to create a generic demonstration app. The documentation idea appeals the most, because that also provides an opportunity for creating a proper website for Perseus, which it sorely needs as it continue to grow.

Describe alternatives you've considered
We could just create a demonstration app, but that wouldn't be a real-world use case, and so any performance scores would be a little artificial.

Additional context
Add any other context or screenshots about the feature request here.

Some errors in compilation/execution don't appear in the CLI output

Describe the bug
I ran cargo check, everything works well with no error but when I ran persus serve the servers compiles then exits

this is the current state from the shell

Finished dev [unoptimized + debuginfo] target(s) in 29.30s
Running target/debug/perseus-builder
[1/4] 🔨 Generating your app...❌
[2/4] 🏗️ Building your app to Wasm...✅
[3/4] 📡 Building server...✅

Expected behavior
Is there a way to print the error log?

Environment (please complete the following information):

[package]
name = "emlfront"
version = "0.3.0-beta.3"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
perseus = "0.3.0-beta.17"
sycamore = "0.6.3"
sycamore-router = "0.6.3"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
fluent-bundle = "0.15"
walkdir = "2"
pulldown-cmark = "0.8"
lazy_static = "1"
web-sys = { version = "0.3", features = [ "Event", "EventTarget" ] }
wasm-bindgen = "0.2"
perseus-size-opt = "0.1"

# [lib]
# crate-type = ["cdylib", "rlib"]

Subsequent loads 404 broken

Describe the bug
If a link in a Perseus app goes to a page that doesn't exist, no error page will be displayed. The URL will change, but nothing else will. This is due to a single semicolon I think, and appears to be unrelated to a similar bug in Sycamore routing.

To Reproduce
Steps to reproduce the behavior:

  1. Create a page with a link to a nonexistent page.
  2. Click the link.
  3. Observe that the URL changes, but no error is displayed.

Expected behavior
A 404 message should be displayed

Screenshots
If applicable, add screenshots to help explain your problem.

Environment (please complete the following information):

  • Perseus Version: v0.3.0-beta.1
  • Sycamore Version: v0.6.1
  • OS: Ubuntu
  • Browser: Firefox
  • Browser Version: 93

Additional context
Add any other context about the problem here.

Examples from 0.3.x included in docs for 0.2.x

The second app from (stable) docs does not compile. The reason for it seems like the wrong code snippets are included (those from 0.3.x, not 0.2.x). For example, in the 5th snippet one has RenderFnResultWithCause while in the text it is not mentioned at all (I presume StringResultWithCause is an old name for it).

To Reproduce
Steps to reproduce the behavior:

  1. Follow the tutorial (stable) for the second app
  2. c/p the code from the snippets
  3. perseus serve throws a bunch of errors

Expected behavior
I expect that the example compiles as described :-)

Actual result

error[E0432]: unresolved import `perseus::template::RenderFnResultWithCause`
 --> src/templates/index.rs:3:18
  |
3 |     GenericNode, template::RenderFnResultWithCause, Template,
  |                  ^^^^^^^^^^-----------------------
  |                  |         |
  |                  |         help: a similar name exists in the module: `StringResultWithCause`
  |                  no `RenderFnResultWithCause` in `template`

(...)

error[E0282]: type annotations needed
  --> src/templates/index.rs:41:5
   |
41 |     Ok(serde_json::to_string(&IndexPageProps {
   |     ^^ cannot infer type for type parameter `E` declared on the enum `Result`

error[E0593]: function is expected to take 1 argument, but it takes 2 arguments
  --> src/templates/index.rs:24:25
   |
24 |         .build_state_fn(Rc::new(get_build_props))
   |                         ^^^^^^^^^^^^^^^^^^^^^^^^ expected function that takes 1 argument
...
40 | pub async fn get_build_props(_path: String, _locale: String) -> RenderFnResultWithCause<String> {
   | ----------------------------------------------------------------------------------------------- takes 2 arguments
   |
   = note: required because of the requirements on the impl of `GetBuildStateFnType` for `fn(std::string::String, std::string::String) -> impl Future {get_build_props}`
   = note: required for the cast to the object type `dyn GetBuildStateFnType`

Environment (please complete the following information):

  • Perseus Version: v0.2.3
  • Sycamore Version: v0.6.1
  • OS: Linux

CLI doesn't check for outdated subcrates

Describe the bug
When Perseus is updated so that the internal subcrates in .perseus/ change, the CLI doesn't perform any checks to make sure that they're valid, it just blindly runs them. Being able to provide a sound error message to the user, rather than the current torrent of error messages, would be extremely helpful.

To Reproduce
Steps to reproduce the behavior:

  1. Run perseus build with an old version of Perseus.
  2. Upgrade Perseus.
  3. Run perseus serve in the same project.

Expected behavior
The CLI should ensure that the version of the subcrates matches its own internal version (especially given that all parts of Perseus are synced to the same version number), and print an error to the user asking them to wipe the slate clean with perseus clean (or to manually upgrade if they've ejected) before continuing.

Screenshots
If applicable, add screenshots to help explain your problem.

Environment (please complete the following information):

  • Perseus Version: v0.2.0
  • Sycamore Version: v0.6.0
  • OS: Ubuntu
  • Browser: N/A
  • Browser Version: N/A

Additional context
Add any other context about the problem here.

Engines

Is your feature request related to a problem? Please describe.
In some cases, no amount of plugin magic will be able to solve a problem effectively, and significant code changes need to be made. An example would be ditching the Actix Web integration entirely for something powered by a different system, while still supporting other plugins. In this case, the .perseus/ directory should be replaced entirely with a custom directory, which should work (somewhat) with plugins.

Describe the solution you'd like
Perseus should have a concept of custom engines, which finally gives a name to the stuff in .perseus/. An engine is responsible for tying together all the stuff from the various Perseus crates into a functional app, and it has access to the user's code (hence enabling define_app!). Engines should be changeable, and they should be able to instruct the CLI to operate in different ways. Each engine should declare a JSON file that tells the CLI what each of its commands should do.

Describe alternatives you've considered
Control plugins, but they're not amenable to major infrastructural changes, which would be better handled by whole-directory replacements.

Additional context
This will be a very large change, and will be the main focus of v0.4.0. Until then, it'll be kept open as a tracking issue.

Add CLI `eject` command

Perseus' CLI is to Perseus as create-react-app is to React, but there are cases in which it is too restrictive. These should be few and far between, but, occasionally, it may be required to eject from the CLI and work with the engine of Perseus. To this end, the CLI should support an eject command that removes .perseus/ from the user's .gitignore and gives a brief summary of the powers the user now has.

For those unfamiliar with it, the CLI contains a directory of sub-crates that perform Perseus' internal logic, calling on the perseus and perseus-actix-web crates, as well as the plethora of functions generated by the define_app! macro. Thus, it should be fine to simply expose all this directly to the user, and it's all commented, so it should be reasonably intuitive (after it's been copiously documented).

Note also that the .perseus/ directory has its own .gitignore that ignores the dist/ directory, so the eject command would literally just have to remove .perseus/ from the user's .gitignore. That should be achievable with simple string manipulation, and niche cases can fall back to an error message asking the user to remove the line manually.

Tell templates where they're being rendered

Is your feature request related to a problem? Please describe.
Right now, web_sys panics if you call it on the server, and detecting if you're on the server with it is difficult and badly documented. Thus, it's very difficult to have client-side-only logic in Perseus, which is really a must for any framework like this.

Describe the solution you'd like
Perseus should provide a simple boolean argument to templates along with their state telling them if they're being rendered on the client or the server. This will make things orders of magnitude easier!

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

`0.3.0-beta.9` `perseus deploy` Couldn't get render configuration!: StoreError... on startup

Describe the bug
Once perseus app is deployed using perseus deploy and the standalone server binary in pkg/ dir is executed perseus app throws an error. Bellow is the whole procedure leveraging docker, including outputs from when I ran all of the commands necessary to reproduce the error.

To Reproduce

user@debian:~$ mkdir ./perseus-deploy
user@debian:~$ cat > ./perseus-deploy/Dockerfile <<EOL
> # get the base image
> FROM rust:1.55-slim AS build
> 
> # install build dependencies
> RUN apt update \
> && apt install -y --no-install-recommends lsb-release apt-transport-https \
> git inotify-tools ca-certificates build-essential make gcc curl
> 
> # prepare root project dir
> WORKDIR /app
> 
> # download the target for wasm
> RUN rustup target add wasm32-unknown-unknown
> 
> # install wasm-pack
> RUN cargo install wasm-pack
> 
> # retrieve the project dir
> RUN curl https://codeload.github.com/arctic-hen7/perseus/tar.gz/main | tar -xz --strip=2 perseus-main/examples/basic
> 
> # go to src dir
> WORKDIR /app/basic
> 
> # remove perseus from repo
> RUN rm -rf .perseus/
> 
> # install perseus-cli
> RUN cargo install perseus-cli --version 0.3.0-beta.9
> 
> # adjust perseus version
> RUN sed -i s'/perseus = .*/perseus = "0.3.0-beta.9"/' ./Cargo.toml
> 
> ENV PERSEUS_STANDALONE=true
> 
> # deploy app
> RUN perseus deploy
> 
> # prepare deployment image
> FROM rust:1.55-slim
> 
> WORKDIR /app
> 
> ENV PERSEUS_STANDALONE=true
> 
> COPY --from=build /app/basic /app/
> 
> CMD ["/app/pkg/server"]
> EOL
user@debian:~$ docker build -t perseus-basic:2021-10-15 ./perseus-deploy
Sending build context to Docker daemon   2.56kB
Step 1/17 : FROM rust:1.55-slim AS build
1.55-slim: Pulling from library/rust
7d63c13d9b9b: Pull complete 
963cfbe0bf32: Pull complete 
Digest: sha256:1ee75015d02a52243217fd9e9e9ca4482ce677dc31e0248d80b4b7ce485a2cbb
Status: Downloaded newer image for rust:1.55-slim
 ---> 1ee58c5365b4
Step 2/17 : RUN apt update && apt install -y --no-install-recommends lsb-release apt-transport-https git inotify-tools ca-certificates build-essential make gcc curl
 ---> Running in 31f2f9aa38e5

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Get:1 http://security.debian.org/debian-security bullseye-security InRelease [44.1 kB]
Get:2 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:3 http://deb.debian.org/debian bullseye-updates InRelease [39.4 kB]
Get:4 http://security.debian.org/debian-security bullseye-security/main amd64 Packages [48.0 kB]
Get:5 http://deb.debian.org/debian bullseye/main amd64 Packages [8180 kB]
Get:6 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [2300 B]
Fetched 8430 kB in 4s (2323 kB/s)
Reading package lists...
Building dependency tree...
Reading state information...
All packages are up to date.

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Reading package lists...
Building dependency tree...
Reading state information...
ca-certificates is already the newest version (20210119).
gcc is already the newest version (4:10.2.1-1).
The following additional packages will be installed:
  bzip2 distro-info-data dpkg-dev g++ g++-10 git-man libbrotli1
  libcurl3-gnutls libcurl4 libdpkg-perl liberror-perl libexpat1
  libgdbm-compat4 libgdbm6 libinotifytools0 libldap-2.4-2 libmpdec3
  libncursesw6 libnghttp2-14 libperl5.32 libpsl5 libpython3-stdlib
  libpython3.9-minimal libpython3.9-stdlib libreadline8 librtmp1 libsasl2-2
  libsasl2-modules-db libsqlite3-0 libssh2-1 libstdc++-10-dev media-types
  patch perl perl-modules-5.32 python3 python3-minimal python3.9
  python3.9-minimal readline-common xz-utils
Suggested packages:
  bzip2-doc debian-keyring g++-multilib g++-10-multilib gcc-10-doc
  gettext-base git-daemon-run | git-daemon-sysvinit git-doc git-el git-email
  git-gui gitk gitweb git-cvs git-mediawiki git-svn gnupg sensible-utils bzr
  gdbm-l10n libstdc++-10-doc make-doc ed diffutils-doc perl-doc
  libterm-readline-gnu-perl | libterm-readline-perl-perl
  libtap-harness-archive-perl python3-doc python3-tk python3-venv
  python3.9-venv python3.9-doc binfmt-support readline-doc
Recommended packages:
  fakeroot gnupg libalgorithm-merge-perl less ssh-client
  libfile-fcntllock-perl liblocale-gettext-perl libldap-common libgpm2
  publicsuffix libsasl2-modules netbase
The following NEW packages will be installed:
  apt-transport-https build-essential bzip2 curl distro-info-data dpkg-dev g++
  g++-10 git git-man inotify-tools libbrotli1 libcurl3-gnutls libcurl4
  libdpkg-perl liberror-perl libexpat1 libgdbm-compat4 libgdbm6
  libinotifytools0 libldap-2.4-2 libmpdec3 libncursesw6 libnghttp2-14
  libperl5.32 libpsl5 libpython3-stdlib libpython3.9-minimal
  libpython3.9-stdlib libreadline8 librtmp1 libsasl2-2 libsasl2-modules-db
  libsqlite3-0 libssh2-1 libstdc++-10-dev lsb-release make media-types patch
  perl perl-modules-5.32 python3 python3-minimal python3.9 python3.9-minimal
  readline-common xz-utils
0 upgraded, 48 newly installed, 0 to remove and 0 not upgraded.
Need to get 38.9 MB of archives.
After this operation, 167 MB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bullseye/main amd64 perl-modules-5.32 all 5.32.1-4+deb11u2 [2823 kB]
Get:2 http://deb.debian.org/debian bullseye/main amd64 libgdbm6 amd64 1.19-2 [64.9 kB]
Get:3 http://deb.debian.org/debian bullseye/main amd64 libgdbm-compat4 amd64 1.19-2 [44.7 kB]
Get:4 http://deb.debian.org/debian bullseye/main amd64 libperl5.32 amd64 5.32.1-4+deb11u2 [4106 kB]
Get:5 http://deb.debian.org/debian bullseye/main amd64 perl amd64 5.32.1-4+deb11u2 [293 kB]
Get:6 http://deb.debian.org/debian bullseye/main amd64 libpython3.9-minimal amd64 3.9.2-1 [801 kB]
Get:7 http://deb.debian.org/debian bullseye/main amd64 libexpat1 amd64 2.2.10-2 [96.9 kB]
Get:8 http://deb.debian.org/debian bullseye/main amd64 python3.9-minimal amd64 3.9.2-1 [1955 kB]
Get:9 http://deb.debian.org/debian bullseye/main amd64 python3-minimal amd64 3.9.2-3 [38.2 kB]
Get:10 http://deb.debian.org/debian bullseye/main amd64 media-types all 4.0.0 [30.3 kB]
Get:11 http://deb.debian.org/debian bullseye/main amd64 libmpdec3 amd64 2.5.1-1 [87.7 kB]
Get:12 http://deb.debian.org/debian bullseye/main amd64 libncursesw6 amd64 6.2+20201114-2 [132 kB]
Get:13 http://deb.debian.org/debian bullseye/main amd64 readline-common all 8.1-1 [73.7 kB]
Get:14 http://deb.debian.org/debian bullseye/main amd64 libreadline8 amd64 8.1-1 [169 kB]
Get:15 http://deb.debian.org/debian bullseye/main amd64 libsqlite3-0 amd64 3.34.1-3 [797 kB]
Get:16 http://deb.debian.org/debian bullseye/main amd64 libpython3.9-stdlib amd64 3.9.2-1 [1684 kB]
Get:17 http://deb.debian.org/debian bullseye/main amd64 python3.9 amd64 3.9.2-1 [466 kB]
Get:18 http://deb.debian.org/debian bullseye/main amd64 libpython3-stdlib amd64 3.9.2-3 [21.4 kB]
Get:19 http://deb.debian.org/debian bullseye/main amd64 python3 amd64 3.9.2-3 [37.9 kB]
Get:20 http://deb.debian.org/debian bullseye/main amd64 bzip2 amd64 1.0.8-4 [49.3 kB]
Get:21 http://deb.debian.org/debian bullseye/main amd64 xz-utils amd64 5.2.5-2 [220 kB]
Get:22 http://deb.debian.org/debian bullseye/main amd64 apt-transport-https all 2.2.4 [160 kB]
Get:23 http://deb.debian.org/debian bullseye/main amd64 libstdc++-10-dev amd64 10.2.1-6 [1741 kB]
Get:24 http://deb.debian.org/debian bullseye/main amd64 g++-10 amd64 10.2.1-6 [9380 kB]
Get:25 http://deb.debian.org/debian bullseye/main amd64 g++ amd64 4:10.2.1-1 [1644 B]
Get:26 http://deb.debian.org/debian bullseye/main amd64 make amd64 4.3-4.1 [396 kB]
Get:27 http://deb.debian.org/debian bullseye/main amd64 libdpkg-perl all 1.20.9 [1537 kB]
Get:28 http://deb.debian.org/debian bullseye/main amd64 patch amd64 2.7.6-7 [128 kB]
Get:29 http://deb.debian.org/debian bullseye/main amd64 dpkg-dev all 1.20.9 [2153 kB]
Get:30 http://deb.debian.org/debian bullseye/main amd64 build-essential amd64 12.9 [7704 B]
Get:31 http://deb.debian.org/debian bullseye/main amd64 libbrotli1 amd64 1.0.9-2+b2 [279 kB]
Get:32 http://deb.debian.org/debian bullseye/main amd64 libsasl2-modules-db amd64 2.1.27+dfsg-2.1 [69.1 kB]
Get:33 http://deb.debian.org/debian bullseye/main amd64 libsasl2-2 amd64 2.1.27+dfsg-2.1 [106 kB]
Get:34 http://deb.debian.org/debian bullseye/main amd64 libldap-2.4-2 amd64 2.4.57+dfsg-3 [232 kB]
Get:35 http://deb.debian.org/debian bullseye/main amd64 libnghttp2-14 amd64 1.43.0-1 [77.1 kB]
Get:36 http://deb.debian.org/debian bullseye/main amd64 libpsl5 amd64 0.21.0-1.2 [57.3 kB]
Get:37 http://deb.debian.org/debian bullseye/main amd64 librtmp1 amd64 2.4+20151223.gitfa8646d.1-2+b2 [60.8 kB]
Get:38 http://deb.debian.org/debian bullseye/main amd64 libssh2-1 amd64 1.9.0-2 [156 kB]
Get:39 http://deb.debian.org/debian bullseye/main amd64 libcurl4 amd64 7.74.0-1.3+b1 [341 kB]
Get:40 http://deb.debian.org/debian bullseye/main amd64 curl amd64 7.74.0-1.3+b1 [267 kB]
Get:41 http://deb.debian.org/debian bullseye/main amd64 distro-info-data all 0.51 [7508 B]
Get:42 http://deb.debian.org/debian bullseye/main amd64 libcurl3-gnutls amd64 7.74.0-1.3+b1 [338 kB]
Get:43 http://deb.debian.org/debian bullseye/main amd64 liberror-perl all 0.17029-1 [31.0 kB]
Get:44 http://deb.debian.org/debian bullseye/main amd64 git-man all 1:2.30.2-1 [1827 kB]
Get:45 http://deb.debian.org/debian bullseye/main amd64 git amd64 1:2.30.2-1 [5527 kB]
Get:46 http://deb.debian.org/debian bullseye/main amd64 libinotifytools0 amd64 3.14-8.1 [18.9 kB]
Get:47 http://deb.debian.org/debian bullseye/main amd64 inotify-tools amd64 3.14-8.1 [25.9 kB]
Get:48 http://deb.debian.org/debian bullseye/main amd64 lsb-release all 11.1.0 [27.9 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 38.9 MB in 10s (4013 kB/s)
Selecting previously unselected package perl-modules-5.32.
(Reading database ... 9284 files and directories currently installed.)
Preparing to unpack .../0-perl-modules-5.32_5.32.1-4+deb11u2_all.deb ...
Unpacking perl-modules-5.32 (5.32.1-4+deb11u2) ...
Selecting previously unselected package libgdbm6:amd64.
Preparing to unpack .../1-libgdbm6_1.19-2_amd64.deb ...
Unpacking libgdbm6:amd64 (1.19-2) ...
Selecting previously unselected package libgdbm-compat4:amd64.
Preparing to unpack .../2-libgdbm-compat4_1.19-2_amd64.deb ...
Unpacking libgdbm-compat4:amd64 (1.19-2) ...
Selecting previously unselected package libperl5.32:amd64.
Preparing to unpack .../3-libperl5.32_5.32.1-4+deb11u2_amd64.deb ...
Unpacking libperl5.32:amd64 (5.32.1-4+deb11u2) ...
Selecting previously unselected package perl.
Preparing to unpack .../4-perl_5.32.1-4+deb11u2_amd64.deb ...
Unpacking perl (5.32.1-4+deb11u2) ...
Selecting previously unselected package libpython3.9-minimal:amd64.
Preparing to unpack .../5-libpython3.9-minimal_3.9.2-1_amd64.deb ...
Unpacking libpython3.9-minimal:amd64 (3.9.2-1) ...
Selecting previously unselected package libexpat1:amd64.
Preparing to unpack .../6-libexpat1_2.2.10-2_amd64.deb ...
Unpacking libexpat1:amd64 (2.2.10-2) ...
Selecting previously unselected package python3.9-minimal.
Preparing to unpack .../7-python3.9-minimal_3.9.2-1_amd64.deb ...
Unpacking python3.9-minimal (3.9.2-1) ...
Setting up libpython3.9-minimal:amd64 (3.9.2-1) ...
Setting up libexpat1:amd64 (2.2.10-2) ...
Setting up python3.9-minimal (3.9.2-1) ...
Selecting previously unselected package python3-minimal.
(Reading database ... 11549 files and directories currently installed.)
Preparing to unpack .../0-python3-minimal_3.9.2-3_amd64.deb ...
Unpacking python3-minimal (3.9.2-3) ...
Selecting previously unselected package media-types.
Preparing to unpack .../1-media-types_4.0.0_all.deb ...
Unpacking media-types (4.0.0) ...
Selecting previously unselected package libmpdec3:amd64.
Preparing to unpack .../2-libmpdec3_2.5.1-1_amd64.deb ...
Unpacking libmpdec3:amd64 (2.5.1-1) ...
Selecting previously unselected package libncursesw6:amd64.
Preparing to unpack .../3-libncursesw6_6.2+20201114-2_amd64.deb ...
Unpacking libncursesw6:amd64 (6.2+20201114-2) ...
Selecting previously unselected package readline-common.
Preparing to unpack .../4-readline-common_8.1-1_all.deb ...
Unpacking readline-common (8.1-1) ...
Selecting previously unselected package libreadline8:amd64.
Preparing to unpack .../5-libreadline8_8.1-1_amd64.deb ...
Unpacking libreadline8:amd64 (8.1-1) ...
Selecting previously unselected package libsqlite3-0:amd64.
Preparing to unpack .../6-libsqlite3-0_3.34.1-3_amd64.deb ...
Unpacking libsqlite3-0:amd64 (3.34.1-3) ...
Selecting previously unselected package libpython3.9-stdlib:amd64.
Preparing to unpack .../7-libpython3.9-stdlib_3.9.2-1_amd64.deb ...
Unpacking libpython3.9-stdlib:amd64 (3.9.2-1) ...
Selecting previously unselected package python3.9.
Preparing to unpack .../8-python3.9_3.9.2-1_amd64.deb ...
Unpacking python3.9 (3.9.2-1) ...
Selecting previously unselected package libpython3-stdlib:amd64.
Preparing to unpack .../9-libpython3-stdlib_3.9.2-3_amd64.deb ...
Unpacking libpython3-stdlib:amd64 (3.9.2-3) ...
Setting up python3-minimal (3.9.2-3) ...
Selecting previously unselected package python3.
(Reading database ... 11987 files and directories currently installed.)
Preparing to unpack .../00-python3_3.9.2-3_amd64.deb ...
Unpacking python3 (3.9.2-3) ...
Selecting previously unselected package bzip2.
Preparing to unpack .../01-bzip2_1.0.8-4_amd64.deb ...
Unpacking bzip2 (1.0.8-4) ...
Selecting previously unselected package xz-utils.
Preparing to unpack .../02-xz-utils_5.2.5-2_amd64.deb ...
Unpacking xz-utils (5.2.5-2) ...
Selecting previously unselected package apt-transport-https.
Preparing to unpack .../03-apt-transport-https_2.2.4_all.deb ...
Unpacking apt-transport-https (2.2.4) ...
Selecting previously unselected package libstdc++-10-dev:amd64.
Preparing to unpack .../04-libstdc++-10-dev_10.2.1-6_amd64.deb ...
Unpacking libstdc++-10-dev:amd64 (10.2.1-6) ...
Selecting previously unselected package g++-10.
Preparing to unpack .../05-g++-10_10.2.1-6_amd64.deb ...
Unpacking g++-10 (10.2.1-6) ...
Selecting previously unselected package g++.
Preparing to unpack .../06-g++_4%3a10.2.1-1_amd64.deb ...
Unpacking g++ (4:10.2.1-1) ...
Selecting previously unselected package make.
Preparing to unpack .../07-make_4.3-4.1_amd64.deb ...
Unpacking make (4.3-4.1) ...
Selecting previously unselected package libdpkg-perl.
Preparing to unpack .../08-libdpkg-perl_1.20.9_all.deb ...
Unpacking libdpkg-perl (1.20.9) ...
Selecting previously unselected package patch.
Preparing to unpack .../09-patch_2.7.6-7_amd64.deb ...
Unpacking patch (2.7.6-7) ...
Selecting previously unselected package dpkg-dev.
Preparing to unpack .../10-dpkg-dev_1.20.9_all.deb ...
Unpacking dpkg-dev (1.20.9) ...
Selecting previously unselected package build-essential.
Preparing to unpack .../11-build-essential_12.9_amd64.deb ...
Unpacking build-essential (12.9) ...
Selecting previously unselected package libbrotli1:amd64.
Preparing to unpack .../12-libbrotli1_1.0.9-2+b2_amd64.deb ...
Unpacking libbrotli1:amd64 (1.0.9-2+b2) ...
Selecting previously unselected package libsasl2-modules-db:amd64.
Preparing to unpack .../13-libsasl2-modules-db_2.1.27+dfsg-2.1_amd64.deb ...
Unpacking libsasl2-modules-db:amd64 (2.1.27+dfsg-2.1) ...
Selecting previously unselected package libsasl2-2:amd64.
Preparing to unpack .../14-libsasl2-2_2.1.27+dfsg-2.1_amd64.deb ...
Unpacking libsasl2-2:amd64 (2.1.27+dfsg-2.1) ...
Selecting previously unselected package libldap-2.4-2:amd64.
Preparing to unpack .../15-libldap-2.4-2_2.4.57+dfsg-3_amd64.deb ...
Unpacking libldap-2.4-2:amd64 (2.4.57+dfsg-3) ...
Selecting previously unselected package libnghttp2-14:amd64.
Preparing to unpack .../16-libnghttp2-14_1.43.0-1_amd64.deb ...
Unpacking libnghttp2-14:amd64 (1.43.0-1) ...
Selecting previously unselected package libpsl5:amd64.
Preparing to unpack .../17-libpsl5_0.21.0-1.2_amd64.deb ...
Unpacking libpsl5:amd64 (0.21.0-1.2) ...
Selecting previously unselected package librtmp1:amd64.
Preparing to unpack .../18-librtmp1_2.4+20151223.gitfa8646d.1-2+b2_amd64.deb ...
Unpacking librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b2) ...
Selecting previously unselected package libssh2-1:amd64.
Preparing to unpack .../19-libssh2-1_1.9.0-2_amd64.deb ...
Unpacking libssh2-1:amd64 (1.9.0-2) ...
Selecting previously unselected package libcurl4:amd64.
Preparing to unpack .../20-libcurl4_7.74.0-1.3+b1_amd64.deb ...
Unpacking libcurl4:amd64 (7.74.0-1.3+b1) ...
Selecting previously unselected package curl.
Preparing to unpack .../21-curl_7.74.0-1.3+b1_amd64.deb ...
Unpacking curl (7.74.0-1.3+b1) ...
Selecting previously unselected package distro-info-data.
Preparing to unpack .../22-distro-info-data_0.51_all.deb ...
Unpacking distro-info-data (0.51) ...
Selecting previously unselected package libcurl3-gnutls:amd64.
Preparing to unpack .../23-libcurl3-gnutls_7.74.0-1.3+b1_amd64.deb ...
Unpacking libcurl3-gnutls:amd64 (7.74.0-1.3+b1) ...
Selecting previously unselected package liberror-perl.
Preparing to unpack .../24-liberror-perl_0.17029-1_all.deb ...
Unpacking liberror-perl (0.17029-1) ...
Selecting previously unselected package git-man.
Preparing to unpack .../25-git-man_1%3a2.30.2-1_all.deb ...
Unpacking git-man (1:2.30.2-1) ...
Selecting previously unselected package git.
Preparing to unpack .../26-git_1%3a2.30.2-1_amd64.deb ...
Unpacking git (1:2.30.2-1) ...
Selecting previously unselected package libinotifytools0:amd64.
Preparing to unpack .../27-libinotifytools0_3.14-8.1_amd64.deb ...
Unpacking libinotifytools0:amd64 (3.14-8.1) ...
Selecting previously unselected package inotify-tools.
Preparing to unpack .../28-inotify-tools_3.14-8.1_amd64.deb ...
Unpacking inotify-tools (3.14-8.1) ...
Selecting previously unselected package lsb-release.
Preparing to unpack .../29-lsb-release_11.1.0_all.deb ...
Unpacking lsb-release (11.1.0) ...
Setting up media-types (4.0.0) ...
Setting up libinotifytools0:amd64 (3.14-8.1) ...
Setting up libpsl5:amd64 (0.21.0-1.2) ...
Setting up libstdc++-10-dev:amd64 (10.2.1-6) ...
Setting up g++-10 (10.2.1-6) ...
Setting up apt-transport-https (2.2.4) ...
Setting up distro-info-data (0.51) ...
Setting up perl-modules-5.32 (5.32.1-4+deb11u2) ...
Setting up libbrotli1:amd64 (1.0.9-2+b2) ...
Setting up libsqlite3-0:amd64 (3.34.1-3) ...
Setting up libnghttp2-14:amd64 (1.43.0-1) ...
Setting up bzip2 (1.0.8-4) ...
Setting up libsasl2-modules-db:amd64 (2.1.27+dfsg-2.1) ...
Setting up make (4.3-4.1) ...
Setting up librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b2) ...
Setting up xz-utils (5.2.5-2) ...
update-alternatives: using /usr/bin/xz to provide /usr/bin/lzma (lzma) in auto mode
update-alternatives: warning: skip creation of /usr/share/man/man1/lzma.1.gz because associated file /usr/share/man/man1/xz.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/unlzma.1.gz because associated file /usr/share/man/man1/unxz.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzcat.1.gz because associated file /usr/share/man/man1/xzcat.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzmore.1.gz because associated file /usr/share/man/man1/xzmore.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzless.1.gz because associated file /usr/share/man/man1/xzless.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzdiff.1.gz because associated file /usr/share/man/man1/xzdiff.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzcmp.1.gz because associated file /usr/share/man/man1/xzcmp.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzgrep.1.gz because associated file /usr/share/man/man1/xzgrep.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzegrep.1.gz because associated file /usr/share/man/man1/xzegrep.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzfgrep.1.gz because associated file /usr/share/man/man1/xzfgrep.1.gz (of link group lzma) doesn't exist
Setting up patch (2.7.6-7) ...
Setting up libncursesw6:amd64 (6.2+20201114-2) ...
Setting up libsasl2-2:amd64 (2.1.27+dfsg-2.1) ...
Setting up inotify-tools (3.14-8.1) ...
Setting up g++ (4:10.2.1-1) ...
update-alternatives: using /usr/bin/g++ to provide /usr/bin/c++ (c++) in auto mode
Setting up libmpdec3:amd64 (2.5.1-1) ...
Setting up git-man (1:2.30.2-1) ...
Setting up libssh2-1:amd64 (1.9.0-2) ...
Setting up readline-common (8.1-1) ...
Setting up libgdbm6:amd64 (1.19-2) ...
Setting up libreadline8:amd64 (8.1-1) ...
Setting up libldap-2.4-2:amd64 (2.4.57+dfsg-3) ...
Setting up libcurl3-gnutls:amd64 (7.74.0-1.3+b1) ...
Setting up libgdbm-compat4:amd64 (1.19-2) ...
Setting up libperl5.32:amd64 (5.32.1-4+deb11u2) ...
Setting up libcurl4:amd64 (7.74.0-1.3+b1) ...
Setting up curl (7.74.0-1.3+b1) ...
Setting up libpython3.9-stdlib:amd64 (3.9.2-1) ...
Setting up libpython3-stdlib:amd64 (3.9.2-3) ...
Setting up perl (5.32.1-4+deb11u2) ...
Setting up libdpkg-perl (1.20.9) ...
Setting up python3.9 (3.9.2-1) ...
Setting up python3 (3.9.2-3) ...
running python rtupdate hooks for python3.9...
running python post-rtupdate hooks for python3.9...
Setting up dpkg-dev (1.20.9) ...
Setting up liberror-perl (0.17029-1) ...
Setting up git (1:2.30.2-1) ...
Setting up build-essential (12.9) ...
Setting up lsb-release (11.1.0) ...
Processing triggers for libc-bin (2.31-13+deb11u2) ...
Removing intermediate container 31f2f9aa38e5
 ---> 41b4d9a9ba9d
Step 3/17 : WORKDIR /app
 ---> Running in 6a292e850bdf
Removing intermediate container 6a292e850bdf
 ---> 711890f84779
Step 4/17 : RUN rustup target add wasm32-unknown-unknown
 ---> Running in 5c7d203affef
info: downloading component 'rust-std' for 'wasm32-unknown-unknown'
info: installing component 'rust-std' for 'wasm32-unknown-unknown'
Removing intermediate container 5c7d203affef
 ---> ec80e759f7fe
Step 5/17 : RUN cargo install wasm-pack
 ---> Running in d057f27b906a
    Updating crates.io index
 Downloading crates ...
  Downloaded wasm-pack v0.10.1
  Installing wasm-pack v0.10.1
 Downloading crates ...
  Downloaded addr2line v0.16.0
  Downloaded dialoguer v0.3.0
  Downloaded env_logger v0.5.13
  Downloaded failure v0.1.8
  Downloaded filetime v0.2.15
  Downloaded flate2 v1.0.22
  Downloaded fnv v1.0.7
  Downloaded tokio-timer v0.2.13
  Downloaded unicode-bidi v0.3.7
  Downloaded httparse v1.5.1
  Downloaded hex v0.3.2
  Downloaded glob v0.2.11
  Downloaded tokio-current-thread v0.1.7
  Downloaded thiserror v1.0.30
  Downloaded clicolors-control v0.2.0
  Downloaded lock_api v0.3.4
  Downloaded base64 v0.10.1
  Downloaded http v0.1.21
  Downloaded instant v0.1.11
  Downloaded humantime v1.3.0
  Downloaded iovec v0.1.4
  Downloaded cargo_metadata v0.8.2
  Downloaded is_executable v0.1.2
  Downloaded lazy_static v0.2.11
  Downloaded itoa v0.4.8
  Downloaded lock_api v0.1.5
  Downloaded matches v0.1.9
  Downloaded memoffset v0.5.6
  Downloaded percent-encoding v1.0.1
  Downloaded parking_lot_core v0.3.1
  Downloaded percent-encoding v2.1.0
  Downloaded parking_lot_core v0.8.5
  Downloaded adler v1.0.2
  Downloaded aho-corasick v0.7.18
  Downloaded binary-install v0.0.2
  Downloaded atty v0.2.14
  Downloaded backtrace v0.3.61
  Downloaded bytes v0.4.12
  Downloaded rustc-demangle v0.1.21
  Downloaded scopeguard v0.3.3
  Downloaded quick-error v1.2.3
  Downloaded rand_xorshift v0.1.1
  Downloaded cfg-if v1.0.0
  Downloaded console v0.6.2
  Downloaded cfg-if v0.1.10
  Downloaded regex v1.5.4
  Downloaded console v0.15.0
  Downloaded crc32fast v1.2.1
  Downloaded cookie_store v0.7.0
  Downloaded cookie v0.12.0
  Downloaded proc-macro2 v1.0.30
  Downloaded crossbeam-deque v0.7.4
  Downloaded serde_ignored v0.0.4
  Downloaded serde v1.0.130
  Downloaded quote v1.0.10
  Downloaded os_type v2.3.0
  Downloaded serde_derive v1.0.130
  Downloaded once_cell v1.8.0
  Downloaded libc v0.2.103
  Downloaded stable_deref_trait v1.2.0
  Downloaded smallvec v0.6.14
  Downloaded serde_json v1.0.68
  Downloaded cc v1.0.71
  Downloaded tempfile v2.2.0
  Downloaded tokio v0.1.22
  Downloaded termcolor v1.1.2
  Downloaded tinyvec_macros v0.1.0
  Downloaded slab v0.4.5
  Downloaded tar v0.4.37
  Downloaded tokio-executor v0.1.10
  Downloaded chrono v0.4.19
  Downloaded tokio-io v0.1.13
  Downloaded tokio-tcp v0.1.4
  Downloaded tokio-sync v0.1.8
  Downloaded toml v0.5.8
  Downloaded unicode-xid v0.2.2
  Downloaded try_from v0.3.2
  Downloaded try-lock v0.2.3
  Downloaded unicode-segmentation v1.8.0
  Downloaded proc-macro-error-attr v1.0.4
  Downloaded unicode-normalization v0.1.19
  Downloaded num-integer v0.1.44
  Downloaded clap v2.33.3
  Downloaded url v1.7.2
  Downloaded url v2.2.2
  Downloaded uuid v0.7.4
  Downloaded crossbeam-queue v0.2.3
  Downloaded crossbeam-epoch v0.8.2
  Downloaded vec_map v0.8.2
  Downloaded curl v0.4.39
  Downloaded xattr v0.2.2
  Downloaded walkdir v2.3.2
  Downloaded zip v0.5.13
  Downloaded uuid v0.8.2
  Downloaded which v2.0.1
  Downloaded version_check v0.9.3
  Downloaded unicase v2.6.0
  Downloaded failure_derive v0.1.8
  Downloaded dirs v1.0.5
  Downloaded form_urlencoded v1.0.1
  Downloaded parking_lot v0.11.2
  Downloaded structopt v0.3.23
  Downloaded unicode-width v0.1.9
  Downloaded thiserror-impl v1.0.30
  Downloaded futures v0.1.31
  Downloaded publicsuffix v1.5.6
  Downloaded mio v0.6.23
  Downloaded time v0.1.43
  Downloaded termios v0.3.3
  Downloaded libz-sys v1.1.3
  Downloaded toml v0.4.10
  Downloaded want v0.2.0
  Downloaded miniz_oxide v0.4.4
  Downloaded http-body v0.1.0
  Downloaded dtoa v0.4.8
  Downloaded bzip2 v0.4.3
  Downloaded rand v0.4.6
  Downloaded heck v0.3.3
  Downloaded rand v0.5.6
  Downloaded autocfg v1.0.1
  Downloaded byteorder v1.4.3
  Downloaded hashbrown v0.11.2
  Downloaded rand v0.3.23
  Downloaded num_cpus v1.13.0
  Downloaded memchr v2.4.1
  Downloaded mime v0.3.16
  Downloaded serde_urlencoded v0.5.5
  Downloaded semver-parser v0.7.0
  Downloaded openssl-probe v0.1.4
  Downloaded net2 v0.2.37
  Downloaded hyper v0.12.36
  Downloaded native-tls v0.2.8
  Downloaded hyper-tls v0.3.2
  Downloaded openssl v0.10.36
  Downloaded human-panic v1.0.3
  Downloaded string v0.2.1
  Downloaded siphasher v0.2.3
  Downloaded pkg-config v0.3.20
  Downloaded indexmap v1.7.0
  Downloaded socket2 v0.4.2
  Downloaded textwrap v0.11.0
  Downloaded foreign-types-shared v0.1.1
  Downloaded foreign-types v0.3.2
  Downloaded ryu v1.0.5
  Downloaded openssl-sys v0.9.67
  Downloaded log v0.4.14
  Downloaded lock_api v0.4.5
  Downloaded getrandom v0.2.3
  Downloaded mime_guess v2.0.3
  Downloaded proc-macro-error v1.0.4
  Downloaded futures-cpupool v0.1.8
  Downloaded num-traits v0.2.14
  Downloaded terminal_size v0.1.17
  Downloaded rand_isaac v0.1.1
  Downloaded tinyvec v1.5.0
  Downloaded lazy_static v1.4.0
  Downloaded rand_os v0.1.3
  Downloaded rand_core v0.4.2
  Downloaded rand_hc v0.1.0
  Downloaded rand v0.6.5
  Downloaded synstructure v0.12.6
  Downloaded crossbeam-utils v0.7.2
  Downloaded idna v0.2.3
  Downloaded maybe-uninit v2.0.0
  Downloaded idna v0.1.5
  Downloaded semver v0.9.0
  Downloaded same-file v1.0.6
  Downloaded object v0.26.2
  Downloaded scopeguard v1.1.0
  Downloaded rand_chacha v0.1.1
  Downloaded h2 v0.1.26
  Downloaded gimli v0.25.0
  Downloaded tokio-threadpool v0.1.18
  Downloaded bitflags v1.3.2
  Downloaded ansi_term v0.11.0
  Downloaded reqwest v0.9.24
  Downloaded rand_jitter v0.1.4
  Downloaded parking_lot v0.6.4
  Downloaded syn v1.0.80
  Downloaded owning_ref v0.4.1
  Downloaded tokio-reactor v0.1.12
  Downloaded rand_pcg v0.1.2
  Downloaded rand_core v0.3.1
  Downloaded parking_lot v0.9.0
  Downloaded tokio-buf v0.1.1
  Downloaded strsim v0.8.0
  Downloaded autocfg v0.1.7
  Downloaded structopt-derive v0.4.16
  Downloaded rustc_version v0.2.3
  Downloaded smallvec v1.7.0
  Downloaded either v1.6.1
  Downloaded parking_lot_core v0.6.2
  Downloaded regex-syntax v0.6.25
  Downloaded bzip2-sys v0.1.11+1.0.8
  Downloaded openssl-src v111.16.0+1.1.1l
  Downloaded encoding_rs v0.8.28
  Downloaded curl-sys v0.4.49+curl-7.79.1
   Compiling libc v0.2.103
   Compiling autocfg v1.0.1
   Compiling proc-macro2 v1.0.30
   Compiling unicode-xid v0.2.2
   Compiling syn v1.0.80
   Compiling serde v1.0.130
   Compiling cfg-if v1.0.0
   Compiling serde_derive v1.0.130
   Compiling cc v1.0.71
   Compiling pkg-config v0.3.20
   Compiling cfg-if v0.1.10
   Compiling semver-parser v0.7.0
   Compiling maybe-uninit v2.0.0
   Compiling futures v0.1.31
   Compiling version_check v0.9.3
   Compiling lazy_static v1.4.0
   Compiling memchr v2.4.1
   Compiling log v0.4.14
   Compiling byteorder v1.4.3
   Compiling rand_core v0.4.2
   Compiling scopeguard v1.1.0
   Compiling either v1.6.1
   Compiling tinyvec_macros v0.1.0
   Compiling autocfg v0.1.7
   Compiling itoa v0.4.8
   Compiling slab v0.4.5
   Compiling matches v0.1.9
   Compiling adler v1.0.2
   Compiling fnv v1.0.7
   Compiling unicode-bidi v0.3.7
   Compiling gimli v0.25.0
   Compiling failure_derive v0.1.8
   Compiling rustc-demangle v0.1.21
   Compiling once_cell v1.8.0
   Compiling regex-syntax v0.6.25
   Compiling ryu v1.0.5
   Compiling bitflags v1.3.2
   Compiling unicode-width v0.1.9
   Compiling crc32fast v1.2.1
   Compiling hashbrown v0.11.2
   Compiling serde_json v1.0.68
   Compiling openssl-probe v0.1.4
   Compiling percent-encoding v1.0.1
   Compiling percent-encoding v2.1.0
   Compiling openssl v0.10.36
   Compiling httparse v1.5.1
   Compiling foreign-types-shared v0.1.1
   Compiling native-tls v0.2.8
   Compiling parking_lot_core v0.8.5
   Compiling try-lock v0.2.3
   Compiling smallvec v1.7.0
   Compiling unicode-segmentation v1.8.0
   Compiling encoding_rs v0.8.28
   Compiling stable_deref_trait v1.2.0
   Compiling curl v0.4.39
   Compiling dtoa v0.4.8
   Compiling ansi_term v0.11.0
   Compiling mime v0.3.16
   Compiling vec_map v0.8.2
   Compiling lazy_static v0.2.11
   Compiling termcolor v1.1.2
   Compiling scopeguard v0.3.3
   Compiling strsim v0.8.0
   Compiling quick-error v1.2.3
   Compiling is_executable v0.1.2
   Compiling siphasher v0.2.3
   Compiling hex v0.3.2
   Compiling same-file v1.0.6
   Compiling glob v0.2.11
   Compiling instant v0.1.11
   Compiling try_from v0.3.2
   Compiling crossbeam-utils v0.7.2
   Compiling miniz_oxide v0.4.4
   Compiling memoffset v0.5.6
   Compiling crossbeam-epoch v0.8.2
   Compiling indexmap v1.7.0
   Compiling num-traits v0.2.14
   Compiling num-integer v0.1.44
   Compiling openssl-src v111.16.0+1.1.1l
   Compiling lock_api v0.3.4
   Compiling lock_api v0.4.5
   Compiling unicase v2.6.0
   Compiling proc-macro-error-attr v1.0.4
   Compiling proc-macro-error v1.0.4
   Compiling tinyvec v1.5.0
   Compiling rand_core v0.3.1
   Compiling rand_jitter v0.1.4
   Compiling base64 v0.10.1
   Compiling rand_chacha v0.1.1
   Compiling rand_pcg v0.1.2
   Compiling rand v0.6.5
   Compiling tokio-sync v0.1.8
   Compiling backtrace v0.3.61
   Compiling libz-sys v1.1.3
   Compiling curl-sys v0.4.49+curl-7.79.1
   Compiling bzip2-sys v0.1.11+1.0.8
   Compiling textwrap v0.11.0
   Compiling form_urlencoded v1.0.1
   Compiling foreign-types v0.3.2
   Compiling owning_ref v0.4.1
   Compiling addr2line v0.16.0
   Compiling heck v0.3.3
   Compiling humantime v1.3.0
   Compiling walkdir v2.3.2
   Compiling openssl-sys v0.9.67
   Compiling rand_isaac v0.1.1
   Compiling rand_xorshift v0.1.1
   Compiling rand_hc v0.1.0
   Compiling unicode-normalization v0.1.19
   Compiling lock_api v0.1.5
   Compiling smallvec v0.6.14
   Compiling quote v1.0.10
   Compiling iovec v0.1.4
   Compiling time v0.1.43
   Compiling num_cpus v1.13.0
   Compiling net2 v0.2.37
   Compiling atty v0.2.14
   Compiling rand v0.4.6
   Compiling rand_os v0.1.3
   Compiling terminal_size v0.1.17
   Compiling filetime v0.2.15
   Compiling getrandom v0.2.3
   Compiling xattr v0.2.2
   Compiling rand v0.5.6
   Compiling socket2 v0.4.2
   Compiling clicolors-control v0.2.0
   Compiling dirs v1.0.5
   Compiling termios v0.3.3
   Compiling want v0.2.0
   Compiling object v0.26.2
   Compiling aho-corasick v0.7.18
   Compiling idna v0.1.5
   Compiling idna v0.2.3
   Compiling flate2 v1.0.22
   Compiling bytes v0.4.12
   Compiling futures-cpupool v0.1.8
   Compiling mio v0.6.23
   Compiling clap v2.33.3
   Compiling env_logger v0.5.13
   Compiling uuid v0.8.2
   Compiling rand v0.3.23
   Compiling parking_lot v0.11.2
   Compiling tar v0.4.37
   Compiling tokio-executor v0.1.10
   Compiling crossbeam-queue v0.2.3
   Compiling regex v1.5.4
   Compiling mime_guess v2.0.3
   Compiling url v1.7.2
   Compiling url v2.2.2
   Compiling tokio-io v0.1.13
   Compiling http v0.1.21
   Compiling tokio-buf v0.1.1
   Compiling string v0.2.1
   Compiling synstructure v0.12.6
   Compiling tempfile v2.2.0
   Compiling bzip2 v0.4.3
   Compiling tokio-timer v0.2.13
   Compiling tokio-current-thread v0.1.7
   Compiling crossbeam-deque v0.7.4
   Compiling chrono v0.4.19
   Compiling console v0.15.0
   Compiling os_type v2.3.0
   Compiling console v0.6.2
   Compiling publicsuffix v1.5.6
   Compiling cookie v0.12.0
   Compiling uuid v0.7.4
   Compiling thiserror-impl v1.0.30
   Compiling h2 v0.1.26
   Compiling http-body v0.1.0
   Compiling structopt-derive v0.4.16
   Compiling tokio-threadpool v0.1.18
   Compiling dialoguer v0.3.0
   Compiling failure v0.1.8
   Compiling thiserror v1.0.30
   Compiling structopt v0.3.23
   Compiling zip v0.5.13
   Compiling which v2.0.1
   Compiling semver v0.9.0
   Compiling serde_urlencoded v0.5.5
   Compiling toml v0.5.8
   Compiling serde_ignored v0.0.4
   Compiling toml v0.4.10
   Compiling rustc_version v0.2.3
   Compiling cookie_store v0.7.0
   Compiling cargo_metadata v0.8.2
   Compiling parking_lot_core v0.6.2
   Compiling parking_lot v0.9.0
   Compiling hyper v0.12.36
   Compiling parking_lot_core v0.3.1
   Compiling human-panic v1.0.3
   Compiling parking_lot v0.6.4
   Compiling tokio-reactor v0.1.12
   Compiling tokio-tcp v0.1.4
   Compiling tokio v0.1.22
   Compiling hyper-tls v0.3.2
   Compiling reqwest v0.9.24
   Compiling binary-install v0.0.2
   Compiling wasm-pack v0.10.1
    Finished release [optimized] target(s) in 3m 03s
  Installing /usr/local/cargo/bin/wasm-pack
   Installed package `wasm-pack v0.10.1` (executable `wasm-pack`)
Removing intermediate container d057f27b906a
 ---> b519a1fed279
Step 6/17 : RUN curl https://codeload.github.com/arctic-hen7/perseus/tar.gz/main | tar -xz --strip=2 perseus-main/examples/basic
 ---> Running in 49566188575d
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  305k    0  305k    0     0   337k      0 --:--:-- --:--:-- --:--:--  336k
Removing intermediate container 49566188575d
 ---> 3eb521250638
Step 7/17 : WORKDIR /app/basic
 ---> Running in f2d0e5a53f81
Removing intermediate container f2d0e5a53f81
 ---> 97f78cb22bb8
Step 8/17 : RUN rm -rf .perseus/
 ---> Running in 39fc27df3f82
Removing intermediate container 39fc27df3f82
 ---> 899d1514acf6
Step 9/17 : RUN cargo install perseus-cli --version 0.3.0-beta.9
 ---> Running in cf279cd747fa
 Downloading crates ...
  Downloaded perseus-cli v0.3.0-beta.9
    Updating crates.io index
  Installing perseus-cli v0.3.0-beta.9
 Downloading crates ...
  Downloaded clap_derive v3.0.0-beta.4
  Downloaded cargo_toml v0.9.2
  Downloaded textwrap v0.14.2
  Downloaded console v0.14.1
  Downloaded anyhow v1.0.44
  Downloaded clap v3.0.0-beta.4
  Downloaded fmterr v0.1.1
  Downloaded fs_extra v1.2.0
  Downloaded include_dir v0.6.2
  Downloaded os_str_bytes v3.1.0
  Downloaded number_prefix v0.4.0
  Downloaded strsim v0.10.0
  Downloaded glob v0.3.0
  Downloaded proc-macro-hack v0.5.19
  Downloaded indicatif v0.17.0-beta.1
  Downloaded include_dir_impl v0.6.2
   Compiling proc-macro2 v1.0.30
   Compiling unicode-xid v0.2.2
   Compiling syn v1.0.80
   Compiling libc v0.2.103
   Compiling version_check v0.9.3
   Compiling serde v1.0.130
   Compiling proc-macro-hack v0.5.19
   Compiling anyhow v1.0.44
   Compiling autocfg v1.0.1
   Compiling unicode-width v0.1.9
   Compiling unicode-segmentation v1.8.0
   Compiling ryu v1.0.5
   Compiling regex-syntax v0.6.25
   Compiling serde_derive v1.0.130
   Compiling lazy_static v1.4.0
   Compiling hashbrown v0.11.2
   Compiling once_cell v1.8.0
   Compiling serde_json v1.0.68
   Compiling termcolor v1.1.2
   Compiling itoa v0.4.8
   Compiling glob v0.3.0
   Compiling bitflags v1.3.2
   Compiling vec_map v0.8.2
   Compiling number_prefix v0.4.0
   Compiling strsim v0.10.0
   Compiling os_str_bytes v3.1.0
   Compiling fmterr v0.1.1
   Compiling fs_extra v1.2.0
   Compiling proc-macro-error-attr v1.0.4
   Compiling proc-macro-error v1.0.4
   Compiling textwrap v0.14.2
   Compiling indexmap v1.7.0
   Compiling heck v0.3.3
   Compiling regex v1.5.4
   Compiling quote v1.0.10
   Compiling terminal_size v0.1.17
   Compiling atty v0.2.14
   Compiling console v0.15.0
   Compiling console v0.14.1
   Compiling indicatif v0.17.0-beta.1
   Compiling toml v0.5.8
   Compiling thiserror-impl v1.0.30
   Compiling clap_derive v3.0.0-beta.4
   Compiling include_dir_impl v0.6.2
   Compiling include_dir v0.6.2
   Compiling thiserror v1.0.30
   Compiling clap v3.0.0-beta.4
   Compiling cargo_toml v0.9.2
   Compiling perseus-cli v0.3.0-beta.9
    Finished release [optimized] target(s) in 59.30s
  Installing /usr/local/cargo/bin/perseus
   Installed package `perseus-cli v0.3.0-beta.9` (executable `perseus`)
Removing intermediate container cf279cd747fa
 ---> 74bfb5b4d582
Step 10/17 : RUN sed -i s'/perseus = .*/perseus = "0.3.0-beta.9"/' ./Cargo.toml
 ---> Running in 5988aa0449d1
Removing intermediate container 5988aa0449d1
 ---> b7d47f54cc8b
Step 11/17 : ENV PERSEUS_STANDALONE=true
 ---> Running in ba8d62b8435a
Removing intermediate container ba8d62b8435a
 ---> 7bac7193e44e
Step 12/17 : RUN perseus deploy
 ---> Running in 70ca99ce18cf
Not running server because `--no-run` was provided. You can run it manually by running the following executable in `.perseus/server/`.
/app/basic/.perseus/target/release/perseus-cli-server

Deployment complete 🚀! Your app is now available for serving in the standalone folder 'pkg'! You can run it by executing the `server` binary in that folder with the `PERSEUS_STANDALONE` environment variable set to `true`.
Removing intermediate container 70ca99ce18cf
 ---> 08d1bc4a4e1b
Step 13/17 : FROM rust:1.55-slim
 ---> 1ee58c5365b4
Step 14/17 : WORKDIR /app
 ---> Running in b3c5d1bcda94
Removing intermediate container b3c5d1bcda94
 ---> bdcaf7d4b216
Step 15/17 : ENV PERSEUS_STANDALONE=true
 ---> Running in e0a2a8bc2ccf
Removing intermediate container e0a2a8bc2ccf
 ---> 730a3b8c872e
Step 16/17 : COPY --from=build /app/basic /app/
 ---> a495484f0f90
Step 17/17 : CMD ["/app/pkg/server"]
 ---> Running in f2d6a736ec3c
Removing intermediate container f2d6a736ec3c
 ---> 3d63a3b54e7d
Successfully built 3d63a3b54e7d
Successfully tagged perseus-basic:2021-10-15
user@debian:~$ docker images
REPOSITORY          TAG               IMAGE ID       CREATED         SIZE
perseus-basic       2021-10-15        3d63a3b54e7d   2 minutes ago   1.68GB
<none>              <none>            08d1bc4a4e1b   2 minutes ago   2.33GB
user@debian:~$ docker run -d -p 80:80 -p 8080:8080 \
>   --name=perseus-basic perseus-basic:2021-10-15
f8587f9527931c8fd88675d47e8c2a3678fda7ab264ddf3fcb2fb832d9ece248
user@debian:~$ docker logs -f --tail 200 perseus-basic
thread 'actix-rt:worker:0' panicked at 'Couldn't get render configuration!: StoreError(NotFound { name: "./dist/render_conf.json" })', /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/perseus-actix-web-0.3.0-beta.9/src/configurer.rs:72:10
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
thread 'actix-rt:worker:1' panicked at 'called `Result::unwrap()` on an `Err` value: PoisonError { .. }', /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/actix-web-3.3.2/src/server.rs:282:36
thread 'actix-rt:worker:2' panicked at 'called `Result::unwrap()` on an `Err` value: PoisonError { .. }', /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/actix-web-3.3.2/src/server.rs:282:36
thread 'actix-rt:worker:3' panicked at 'called `Result::unwrap()` on an `Err` value: PoisonError { .. }', /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/actix-web-3.3.2/src/server.rs:282:36
thread 'actix-rt:worker:4' panicked at 'called `Result::unwrap()` on an `Err` value: PoisonError { .. }', /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/actix-web-3.3.2/src/server.rs:282:36
thread 'actix-rt:worker:6' panicked at 'called `Result::unwrap()` on an `Err` value: PoisonError { .. }', /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/actix-web-3.3.2/src/server.rs:282:36
thread 'actix-rt:worker:5' panicked at 'called `Result::unwrap()` on an `Err` value: PoisonError { .. }', /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/actix-web-3.3.2/src/server.rs:282:36
thread 'actix-rt:worker:7' panicked at 'called `Result::unwrap()` on an `Err` value: PoisonError { .. }', /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/actix-web-3.3.2/src/server.rs:282:36

Expected behavior
No error and the web app served at http://localhost:8080/

Environment (please complete the following information):

  • Perseus Version: 0.3.0-beta.9
  • Sycamore Version: 0.6
  • OS: debian:bullseye-slim docker image
  • Browser: Not relevant
  • Browser Version: Not relevant

Additional context
Note that the Dockerfile as shown above is created using multiline cat command ending with EOL on it's own line, simply for posterity reasons. Creation of the Dockerfile doesn't need to be done this way.
Note that the FROM rust:1.55-slim call is used twice in the Dockerfile as this shows a two stage image build process producing two docker images.
Finally note that the Dockerfile downloads the basic example with curl from this repo automatically, which makes it standalone.

Add a space after the URL when serve is done

Is your feature request related to a problem? Please describe.

When perseus serve finishes, the message presents the URL immediately followed by an exclamation mark.
VSCode parses the line and finds the URL but it includes the exclamation.

Describe the solution you'd like

Put a space between the URL and the exclamation mark.

Describe alternatives you've considered

The URL could be surrounded by brackets or parenthesis or …
The VSCode parser could be improved, but there might be a lot of parser not detecting the URL correctly

CLI single-threaded mode

Having set up the CLI to be perfectly asynchronous and parallelized, it occurs to me that there are most definitely systems that will have difficulty with this, or scenarios in which sequential execution may be preferred. I'm thinking particularly of systems with older Intel processors.

In light of this, I think it's perfectly reasonable to create a single-threaded mode for the CLI to make execution less straining on these systems (though it will be considerably slower). This won't affect performance of the multi-threaded mode in any way, which will remain the default. I suggest specifying single threaded mode with --sequential.

Pass locale to *build state*

Is your feature request related to a problem? Please describe.
There are plenty of scenarios in which having all your translations in one file is not optimal at all, especially for longform content. For instance, a documentation system might have a separate file for each locale. Right now, Perseus has no way to suspend i18n for a template to enable a manual approach, and this isn't planned presently due to the significant amount of overhaul to the inferred routing system that would be required.

Describe the solution you'd like
The next best thing, and probably actually a better solution, is to pass the locale to the build state function so that translations can be fetched from there efficiently. That change would also enable a number of more complex applications with Perseus.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
This will move us to a new beta version of v0.3.0 (this is exactly why I put it in beta!), and it'll be a change to the function signature, and so a breaking change.

Add capsules system

This is a more ambitious feature, but I think it's doable! I want Perseus to be able to re-render only parts of content, say, keeping a sidebar and a header around while other content changes. The system to do this is too complex to explain here, but I'll publish a formalized document of how it will work soon.

The central idea is that a page should be able to have a structure like Header -> Sidebar -> Content, and each new Content shouldn't trigger a re-render of Header and Sidebar. Moving to a new Sidebar equally shouldn't re-render the Header.

`0.3.0-beta.14` `perseus deploy` fails consistently

Describe the bug
Ever since 0.3.0-beta.14 is out perseus deploy consistently fails with two different errors on two different machines, locally and on a VPS. Right now, in the same way as described bellow, it's also impossible to deploy previous version 0.3.0-beta.13, which worked before the 0.3.0-beta.14 release. The Dockerfile bellow is standalone and does attempt to deploy the tiny example of this repo.

To Reproduce
Dockerfile

# get the base image
FROM rust:1.55-slim AS build

# install build dependencies
RUN apt update \
  && apt install -y --no-install-recommends lsb-release apt-transport-https \
  build-essential curl

# vars
ENV PERSEUS_VERSION=0.3.0-beta.14 \
    WEE_ALLOC_VERSION=0.4

# prepare root project dir
WORKDIR /app

# download the target for wasm
RUN rustup target add wasm32-unknown-unknown

# install wasm-pack
RUN cargo install wasm-pack

# retrieve the src dir
RUN curl https://codeload.github.com/arctic-hen7/perseus/tar.gz/main | tar -xz --strip=2 perseus-main/examples/tiny

# go to src dir
WORKDIR /app/tiny

# install perseus-cli
RUN cargo install perseus-cli --version $PERSEUS_VERSION

# clean app
RUN perseus clean

# specify deps in app config
RUN sed -i s"/perseus = .*/perseus = \"${PERSEUS_VERSION}\"/" ./Cargo.toml \
  && sed -i "/\[dependencies\]/a wee_alloc = \"${WEE_ALLOC_VERSION}\"" ./Cargo.toml \
  && echo ' \n\
[profile.release] \n\
codegen-units = 1 \n\
opt-level = "s" \n\
lto = true ' >> ./Cargo.toml \
  && cat ./Cargo.toml

# modify and prepend lib.rs
RUN sed -i s'/"Hello World!"/"世界您好 !"/' ./src/lib.rs \
  && echo '#[global_allocator] \n\
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; \n\
' | cat - ./src/lib.rs > ./src/lib.rs.tmp \
  && mv ./src/lib.rs.tmp ./src/lib.rs \
  && cat ./src/lib.rs

# prep and eject app
RUN perseus prep && perseus eject

# adjust and append perseus config
RUN sed -i s"/perseus = .*/perseus = \"${PERSEUS_VERSION}\"/" .perseus/Cargo.toml \
  && echo ' \n\n\
[profile.release] \n\
codegen-units = 1 \n\
opt-level = "s" ' >> .perseus/Cargo.toml \
  && cat .perseus/Cargo.toml

# deploy app
RUN perseus deploy

# prepare deployment image
FROM bitnami/minideb:buster

WORKDIR /app

COPY --from=build /app/tiny/pkg /app/

ENV PERSEUS_STANDALONE=true

ENV HOST=0.0.0.0

CMD ["./server"]

Part of docker build output from local machine

...
Step 9/21 : RUN cargo install perseus-cli --version $PERSEUS_VERSION
 ---> Running in 48b225eaec3e
 Downloading crates ...
  Downloaded perseus-cli v0.3.0-beta.14
    Updating crates.io index
  Installing perseus-cli v0.3.0-beta.14
 Downloading crates ...
  Downloaded strsim v0.10.0
  Downloaded textwrap v0.14.2
  Downloaded clap v3.0.0-beta.5
  Downloaded proc-macro-hack v0.5.19
  Downloaded fmterr v0.1.1
  Downloaded glob v0.3.0
  Downloaded anyhow v1.0.44
  Downloaded include_dir_impl v0.6.2
  Downloaded clap_derive v3.0.0-beta.5
  Downloaded console v0.14.1
  Downloaded include_dir v0.6.2
  Downloaded number_prefix v0.4.0
  Downloaded cargo_toml v0.9.2
  Downloaded os_str_bytes v4.2.0
  Downloaded indicatif v0.17.0-beta.1
  Downloaded fs_extra v1.2.0
   Compiling proc-macro2 v1.0.32
   Compiling unicode-xid v0.2.2
   Compiling syn v1.0.81
   Compiling version_check v0.9.3
   Compiling libc v0.2.105
   Compiling serde v1.0.130
   Compiling anyhow v1.0.44
   Compiling memchr v2.4.1
   Compiling proc-macro-hack v0.5.19
   Compiling autocfg v1.0.1
   Compiling regex-syntax v0.6.25
   Compiling unicode-segmentation v1.8.0
   Compiling ryu v1.0.5
   Compiling lazy_static v1.4.0
   Compiling serde_derive v1.0.130
   Compiling unicode-width v0.1.9
   Compiling hashbrown v0.11.2
   Compiling serde_json v1.0.68
   Compiling once_cell v1.8.0
   Compiling itoa v0.4.8
   Compiling strsim v0.10.0
   Compiling termcolor v1.1.2
   Compiling number_prefix v0.4.0
   Compiling bitflags v1.3.2
   Compiling glob v0.3.0
   Compiling fs_extra v1.2.0
   Compiling fmterr v0.1.1
   Compiling proc-macro-error-attr v1.0.4
   Compiling proc-macro-error v1.0.4
   Compiling unicase v2.6.0
   Compiling textwrap v0.14.2
   Compiling indexmap v1.7.0
   Compiling heck v0.3.3
   Compiling regex v1.5.4
   Compiling os_str_bytes v4.2.0
   Compiling quote v1.0.10
   Compiling terminal_size v0.1.17
   Compiling atty v0.2.14
   Compiling console v0.15.0
   Compiling console v0.14.1
   Compiling indicatif v0.17.0-beta.1
   Compiling toml v0.5.8
   Compiling thiserror-impl v1.0.30
   Compiling clap_derive v3.0.0-beta.5
   Compiling include_dir_impl v0.6.2
   Compiling include_dir v0.6.2
   Compiling thiserror v1.0.30
   Compiling clap v3.0.0-beta.5
   Compiling cargo_toml v0.9.2
   Compiling perseus-cli v0.3.0-beta.14
    Finished release [optimized] target(s) in 1m 04s
  Installing /usr/local/cargo/bin/perseus
   Installed package `perseus-cli v0.3.0-beta.14` (executable `perseus`)
Removing intermediate container 48b225eaec3e
 ---> 54bf07daf838
Step 10/21 : RUN perseus clean
 ---> Running in 276dcb6cc379
Removing intermediate container 276dcb6cc379
 ---> e63df3b90eaf
Step 11/21 : RUN sed -i s"/perseus = .*/perseus = \"${PERSEUS_VERSION}\"/" ./Cargo.toml   && sed -i "/\[dependencies\]/a wee_alloc = \"${WEE_ALLOC_VERSION}\"" ./Cargo.toml   && echo ' \n[profile.release] \ncodegen-units = 1 \nopt-level = "s" \nlto = true ' >> ./Cargo.toml   && cat ./Cargo.toml
 ---> Running in ff387002e768
[package]
name = "perseus-example-tiny"
version = "0.3.0-beta.14"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
wee_alloc = "0.4"
perseus = "0.3.0-beta.14"
sycamore = "0.6"
 
[profile.release] 
codegen-units = 1 
opt-level = "s" 
lto = true 
Removing intermediate container ff387002e768
 ---> b87a86f93ac4
Step 12/21 : RUN sed -i s'/"Hello World!"/"世界您好 !"/' ./src/lib.rs   && echo '#[global_allocator] \nstatic ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; \n' | cat - ./src/lib.rs > ./src/lib.rs.tmp   && mv ./src/lib.rs.tmp ./src/lib.rs   && cat ./src/lib.rs
 ---> Running in cd0981669fb5
#[global_allocator] 
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; 

use perseus::{define_app, ErrorPages, Template};
use sycamore::template;
define_app! {
    templates: [
        Template::<G>::new("index").template(|_| {
            template! {
                p { "世界您好 !" }
            }
        })
    ],
    error_pages: ErrorPages::new(|url, status, err, _| {
        template! {
            p { (format!("An error with HTTP code {} occurred at '{}': '{}'.", status, url, err)) }
        }
    })
}
Removing intermediate container cd0981669fb5
 ---> ad243ddb97cf
Step 13/21 : RUN perseus prep && perseus eject
 ---> Running in 296f9f98d805
Removing intermediate container 296f9f98d805
 ---> b1dcbfb61541
Step 14/21 : RUN sed -i s"/perseus = .*/perseus = \"${PERSEUS_VERSION}\"/" .perseus/Cargo.toml   && echo ' \n\n[profile.release] \ncodegen-units = 1 \nopt-level = "s" ' >> .perseus/Cargo.toml   && cat .perseus/Cargo.toml
 ---> Running in 368ed86f1eda
# This crate defines the user's app in terms that Wasm can understand, making development significantly simpler.
# IMPORTANT: spacing matters in this file for runtime replacements, do NOT change it!

[package]
name = "perseus-engine"
version = "0.3.0-beta.14"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
# We alias here because the package name will change based on whatever's in the user's manifest
app = { package = "perseus-example-tiny", path = "../" }

perseus = "0.3.0-beta.14"
sycamore = { version = "0.6", features = ["ssr"] }
sycamore-router = "0.6"
web-sys = { version = "0.3", features = ["Event", "Headers", "Request", "RequestInit", "RequestMode", "Response", "ReadableStream", "Window"] }
wasm-bindgen = "0.2"
wasm-bindgen-futures = "0.4"
console_error_panic_hook = "0.1.6"

# This section is needed for Wasm Pack (which we use instead of Trunk for flexibility)
[lib]
crate-type = ["cdylib", "rlib"]

[workspace] 

[profile.release] 
codegen-units = 1 
opt-level = "s" 
Removing intermediate container 368ed86f1eda
 ---> 711943076fd5
Step 15/21 : RUN perseus deploy
 ---> Running in 37ea51568596
Error: couldn't move `.perseus/pkg/` to `.perseus/dist/pkg/` (run `perseus clean` if this persists)

Caused by:
	Invalid cross-device link (os error 18)
The command '/bin/sh -c perseus deploy' returned a non-zero code: 1

Part of docker build output from VPS

...
Step 9/21 : RUN cargo install perseus-cli --version $PERSEUS_VERSION
 ---> Running in cd545af5bdf3
 Downloading crates ...
  Downloaded perseus-cli v0.3.0-beta.14
    Updating crates.io index
  Installing perseus-cli v0.3.0-beta.14
 Downloading crates ...
  Downloaded cargo_toml v0.9.2
  Downloaded include_dir v0.6.2
  Downloaded fmterr v0.1.1
  Downloaded os_str_bytes v4.2.0
  Downloaded strsim v0.10.0
  Downloaded proc-macro-hack v0.5.19
  Downloaded number_prefix v0.4.0
  Downloaded include_dir_impl v0.6.2
  Downloaded indicatif v0.17.0-beta.1
  Downloaded glob v0.3.0
  Downloaded fs_extra v1.2.0
  Downloaded console v0.14.1
  Downloaded anyhow v1.0.44
  Downloaded clap_derive v3.0.0-beta.5
  Downloaded clap v3.0.0-beta.5
  Downloaded textwrap v0.14.2
   Compiling proc-macro2 v1.0.32
   Compiling unicode-xid v0.2.2
   Compiling syn v1.0.81
   Compiling version_check v0.9.3
   Compiling libc v0.2.105
   Compiling serde v1.0.130
   Compiling anyhow v1.0.44
   Compiling proc-macro-hack v0.5.19
   Compiling autocfg v1.0.1
   Compiling memchr v2.4.1
   Compiling unicode-segmentation v1.8.0
   Compiling ryu v1.0.5
   Compiling unicode-width v0.1.9
   Compiling lazy_static v1.4.0
   Compiling regex-syntax v0.6.25
   Compiling serde_derive v1.0.130
   Compiling once_cell v1.8.0
   Compiling serde_json v1.0.68
   Compiling hashbrown v0.11.2
   Compiling strsim v0.10.0
   Compiling itoa v0.4.8
   Compiling glob v0.3.0
   Compiling number_prefix v0.4.0
   Compiling bitflags v1.3.2
   Compiling termcolor v1.1.2
   Compiling fmterr v0.1.1
   Compiling fs_extra v1.2.0
   Compiling proc-macro-error-attr v1.0.4
   Compiling proc-macro-error v1.0.4
   Compiling unicase v2.6.0
   Compiling indexmap v1.7.0
   Compiling heck v0.3.3
   Compiling textwrap v0.14.2
   Compiling regex v1.5.4
   Compiling quote v1.0.10
   Compiling terminal_size v0.1.17
   Compiling atty v0.2.14
   Compiling toml v0.5.8
   Compiling os_str_bytes v4.2.0
   Compiling console v0.15.0
   Compiling console v0.14.1
   Compiling indicatif v0.17.0-beta.1
   Compiling thiserror-impl v1.0.30
   Compiling include_dir_impl v0.6.2
   Compiling clap_derive v3.0.0-beta.5
   Compiling thiserror v1.0.30
   Compiling include_dir v0.6.2
   Compiling clap v3.0.0-beta.5
   Compiling cargo_toml v0.9.2
   Compiling perseus-cli v0.3.0-beta.14
    Finished release [optimized] target(s) in 2m 43s
  Installing /usr/local/cargo/bin/perseus
   Installed package `perseus-cli v0.3.0-beta.14` (executable `perseus`)
Removing intermediate container cd545af5bdf3
 ---> 25f00239fd3c
Step 10/21 : RUN perseus clean
 ---> Running in 9d5e3832deba
Removing intermediate container 9d5e3832deba
 ---> 27b455fc37f8
Step 11/21 : RUN sed -i s"/perseus = .*/perseus = \"${PERSEUS_VERSION}\"/" ./Cargo.toml   && sed -i "/\[dependencies\]/a wee_alloc = \"${WEE_ALLOC_VERSION}\"" ./Cargo.toml   && echo ' \n[profile.release] \ncodegen-units = 1 \nopt-level = "s" \nlto = true ' >> ./Cargo.toml   && cat ./Cargo.toml
 ---> Running in 81363b9ea235
[package]
name = "perseus-example-tiny"
version = "0.3.0-beta.14"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
wee_alloc = "0.4"
perseus = "0.3.0-beta.14"
sycamore = "0.6"
 
[profile.release] 
codegen-units = 1 
opt-level = "s" 
lto = true 
Removing intermediate container 81363b9ea235
 ---> aa2e155c1003
Step 12/21 : RUN sed -i s'/"Hello World!"/"世界您好 !"/' ./src/lib.rs   && echo '#[global_allocator] \nstatic ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; \n' | cat - ./src/lib.rs > ./src/lib.rs.tmp   && mv ./src/lib.rs.tmp ./src/lib.rs   && cat ./src/lib.rs
 ---> Running in 593b24317e72
#[global_allocator] 
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; 

use perseus::{define_app, ErrorPages, Template};
use sycamore::template;
define_app! {
    templates: [
        Template::<G>::new("index").template(|_| {
            template! {
                p { "世界您好 !" }
            }
        })
    ],
    error_pages: ErrorPages::new(|url, status, err, _| {
        template! {
            p { (format!("An error with HTTP code {} occurred at '{}': '{}'.", status, url, err)) }
        }
    })
}
Removing intermediate container 593b24317e72
 ---> cc3e7f0c4a12
Step 13/21 : RUN perseus prep && perseus eject
 ---> Running in 44ca42cbfb56
Removing intermediate container 44ca42cbfb56
 ---> 6956cf16c8b0
Step 14/21 : RUN sed -i s"/perseus = .*/perseus = \"${PERSEUS_VERSION}\"/" .perseus/Cargo.toml   && echo ' \n\n[profile.release] \ncodegen-units = 1 \nopt-level = "s" ' >> .perseus/Cargo.toml   && cat .perseus/Cargo.toml
 ---> Running in 36fce3a82248
# This crate defines the user's app in terms that Wasm can understand, making development significantly simpler.
# IMPORTANT: spacing matters in this file for runtime replacements, do NOT change it!

[package]
name = "perseus-engine"
version = "0.3.0-beta.14"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
# We alias here because the package name will change based on whatever's in the user's manifest
app = { package = "perseus-example-tiny", path = "../" }

perseus = "0.3.0-beta.14"
sycamore = { version = "0.6", features = ["ssr"] }
sycamore-router = "0.6"
web-sys = { version = "0.3", features = ["Event", "Headers", "Request", "RequestInit", "RequestMode", "Response", "ReadableStream", "Window"] }
wasm-bindgen = "0.2"
wasm-bindgen-futures = "0.4"
console_error_panic_hook = "0.1.6"

# This section is needed for Wasm Pack (which we use instead of Trunk for flexibility)
[lib]
crate-type = ["cdylib", "rlib"]

[workspace] 

[profile.release] 
codegen-units = 1 
opt-level = "s" 
Removing intermediate container 36fce3a82248
 ---> ae1fa886efa7
Step 15/21 : RUN perseus deploy
 ---> Running in 89e40bbf8aac
    Updating crates.io index
    Blocking waiting for file lock on package cache
    Blocking waiting for file lock on package cache
 Downloading crates ...
  Downloaded actix-connect v2.0.0
  Downloaded rustc_version v0.3.3
  Downloaded serde_urlencoded v0.7.0
  Downloaded time-macros-impl v0.1.2
  Downloaded tracing-futures v0.2.5
  Downloaded const_fn v0.4.8
  Downloaded opaque-debug v0.3.0
  Downloaded version_check v0.1.5
  Downloaded ucd-trie v0.1.3
  Downloaded trust-dns-proto v0.19.7
  Downloaded pin-project-internal v1.0.8
  Downloaded pin-project-lite v0.1.12
  Downloaded rand v0.7.3
  Downloaded brotli-sys v0.3.2
  Downloaded actix-testing v1.0.1
  Downloaded actix-service v1.0.6
  Downloaded actix-router v0.2.7
  Downloaded bytestring v1.0.0
  Downloaded actix-web v3.3.2
  Downloaded digest v0.9.0
  Downloaded v_escape v0.15.0
  Downloaded pin-project v0.4.28
  Downloaded semver v0.11.0
  Downloaded time-macros v0.1.1
  Downloaded time v0.2.27
  Downloaded v_htmlescape v0.12.0
  Downloaded trust-dns-resolver v0.19.7
  Downloaded pin-project-internal v0.4.28
  Downloaded tokio-util v0.3.1
  Downloaded tokio v0.2.25
  Downloaded standback v0.2.17
  Downloaded perseus-actix-web v0.3.0-beta.14
  Downloaded lru-cache v0.1.2
  Downloaded generic-array v0.14.4
  Downloaded actix-rt v1.1.1
  Downloaded pest v2.1.3
  Downloaded match_cfg v0.1.0
  Downloaded language-tags v0.2.2
  Downloaded block-buffer v0.9.0
  Downloaded convert_case v0.4.0
  Downloaded actix-server v1.0.4
  Downloaded rand_core v0.5.1
  Downloaded semver-parser v0.10.2
  Downloaded brotli2 v0.3.2
  Downloaded derive_more v0.99.16
  Downloaded h2 v0.2.7
  Downloaded bytes v0.5.6
  Downloaded awc v2.0.3
  Downloaded actix-files v0.5.0
  Downloaded ppv-lite86 v0.2.15
  Downloaded pin-project v1.0.8
  Downloaded nom v4.2.3
  Downloaded tracing-core v0.1.21
  Downloaded enum-as-inner v0.3.3
  Downloaded linked-hash-map v0.5.4
  Downloaded getrandom v0.1.16
  Downloaded cookie v0.14.4
  Downloaded base64 v0.13.0
  Downloaded actix-utils v2.0.0
  Downloaded typenum v1.14.0
  Downloaded tracing v0.1.29
  Downloaded buf-min v0.4.0
  Downloaded v_escape_derive v0.8.5
  Downloaded rand_chacha v0.2.2
  Downloaded mio-uds v0.6.8
  Downloaded hostname v0.3.1
  Downloaded fxhash v0.2.1
  Downloaded cpufeatures v0.2.1
  Downloaded copyless v0.1.5
  Downloaded actix-web-codegen v0.4.0
  Downloaded actix-tls v2.0.0
  Downloaded actix-threadpool v0.3.3
  Downloaded actix-macros v0.1.3
  Downloaded threadpool v1.8.1
  Downloaded signal-hook-registry v1.4.0
  Downloaded sha-1 v0.9.8
  Downloaded resolv-conf v0.7.0
  Downloaded actix-codec v0.3.0
  Downloaded actix-http v2.2.1
  Downloaded socket2 v0.3.19
    Blocking waiting for file lock on package cache
   Compiling proc-macro2 v1.0.32
   Compiling unicode-xid v0.2.2
   Compiling syn v1.0.81
   Compiling libc v0.2.105
   Compiling cfg-if v1.0.0
   Compiling version_check v0.9.3
   Compiling autocfg v1.0.1
   Compiling log v0.4.14
   Compiling memchr v2.4.1
   Compiling proc-macro-hack v0.5.19
   Compiling futures-core v0.3.17
   Compiling slab v0.4.5
   Compiling serde_derive v1.0.130
   Compiling futures-sink v0.3.17
   Compiling serde v1.0.130
   Compiling ryu v1.0.5
   Compiling futures-channel v0.3.17
   Compiling pin-project-lite v0.2.7
   Compiling cfg-if v0.1.10
   Compiling futures-task v0.3.17
   Compiling proc-macro-nested v0.1.7
   Compiling itoa v0.4.8
   Compiling smallvec v1.7.0
   Compiling pin-utils v0.1.0
   Compiling futures-io v0.3.17
   Compiling lazy_static v1.4.0
   Compiling serde_json v1.0.68
   Compiling bytes v0.5.6
   Compiling wasm-bindgen-shared v0.2.78
   Compiling pin-project-lite v0.1.12
   Compiling bumpalo v3.8.0
   Compiling parking_lot_core v0.8.5
   Compiling pin-project-internal v0.4.28
   Compiling scopeguard v1.1.0
   Compiling getrandom v0.1.16
   Compiling convert_case v0.4.0
   Compiling bytes v1.1.0
   Compiling static_assertions v1.1.0
   Compiling wasm-bindgen v0.2.78
   Compiling hashbrown v0.11.2
   Compiling async-trait v0.1.51
   Compiling matches v0.1.9
   Compiling fnv v1.0.7
   Compiling percent-encoding v2.1.0
   Compiling tinyvec_macros v0.1.0
   Compiling typenum v1.14.0
   Compiling bitflags v1.3.2
   Compiling copyless v0.1.5
   Compiling either v1.6.1
   Compiling ppv-lite86 v0.2.15
   Compiling unicode-bidi v0.3.7
   Compiling unicode-segmentation v1.8.0
   Compiling const_fn v0.4.8
   Compiling cc v1.0.71
   Compiling match_cfg v0.1.0
   Compiling ident_case v1.0.1
   Compiling strsim v0.10.0
   Compiling quick-error v1.2.3
   Compiling once_cell v1.8.0
   Compiling version_check v0.1.5
   Compiling linked-hash-map v0.5.4
   Compiling crc32fast v1.2.1
   Compiling minimal-lexical v0.1.4
   Compiling encoding_rs v0.8.29
   Compiling utf8-width v0.1.5
   Compiling regex-syntax v0.6.25
   Compiling adler v1.0.2
   Compiling httparse v1.5.1
   Compiling byteorder v1.4.3
   Compiling mime v0.3.16
   Compiling opaque-debug v0.3.0
   Compiling cpufeatures v0.2.1
   Compiling v_escape v0.15.0
   Compiling language-tags v0.2.2
   Compiling base64 v0.13.0
   Compiling wee_alloc v0.4.5
   Compiling fmterr v0.1.1
   Compiling urlencoding v2.1.0
   Compiling v_htmlescape v0.12.0
   Compiling memory_units v0.4.0
   Compiling instant v0.1.12
   Compiling standback v0.2.17
error: could not compile `regex-syntax`

Caused by:
  process didn't exit successfully: `rustc --crate-name regex_syntax --edition=2018 /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/regex-syntax-0.6.25/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg 'feature="default"' --cfg 'feature="unicode"' --cfg 'feature="unicode-age"' --cfg 'feature="unicode-bool"' --cfg 'feature="unicode-case"' --cfg 'feature="unicode-gencat"' --cfg 'feature="unicode-perl"' --cfg 'feature="unicode-script"' --cfg 'feature="unicode-segment"' -C metadata=09d5543a3c98c8ca -C extra-filename=-09d5543a3c98c8ca --out-dir /app/tiny/.perseus/server/target/release/deps -L dependency=/app/tiny/.perseus/server/target/release/deps --cap-lints allow` (signal: 9, SIGKILL: kill)
warning: build failed, waiting for other jobs to finish...
error: build failed
[INFO]: Checking for the Wasm target...
[INFO]: Compiling to Wasm...
   Compiling proc-macro2 v1.0.32
   Compiling unicode-xid v0.2.2
   Compiling syn v1.0.81
   Compiling autocfg v1.0.1
   Compiling serde_derive v1.0.130
   Compiling serde v1.0.130
   Compiling ryu v1.0.5
   Compiling log v0.4.14
   Compiling wasm-bindgen-shared v0.2.78
   Compiling serde_json v1.0.68
   Compiling cfg-if v1.0.0
   Compiling bumpalo v3.8.0
   Compiling lazy_static v1.4.0
   Compiling version_check v0.9.3
   Compiling itoa v0.4.8
   Compiling memchr v2.4.1
   Compiling wasm-bindgen v0.2.78
   Compiling static_assertions v1.1.0
   Compiling futures-core v0.3.17
   Compiling proc-macro-hack v0.5.19
   Compiling proc-macro-nested v0.1.7
   Compiling futures-task v0.3.17
   Compiling futures-channel v0.3.17
   Compiling libc v0.2.105
   Compiling futures-sink v0.3.17
   Compiling once_cell v1.8.0
   Compiling ident_case v1.0.1
   Compiling fnv v1.0.7
   Compiling hashbrown v0.11.2
   Compiling strsim v0.10.0
   Compiling pin-utils v0.1.0
   Compiling slab v0.4.5
   Compiling futures-io v0.3.17
   Compiling pin-project-lite v0.2.7
   Compiling smallvec v1.7.0
   Compiling minimal-lexical v0.1.4
   Compiling utf8-width v0.1.5
   Compiling async-trait v0.1.51
   Compiling bytes v1.1.0
   Compiling wee_alloc v0.4.5
   Compiling fmterr v0.1.1
   Compiling cfg-if v0.1.10
   Compiling urlencoding v2.1.0
   Compiling memory_units v0.4.0
   Compiling indexmap v1.7.0
   Compiling futures-macro v0.3.17
   Compiling num-traits v0.2.14
   Compiling futures-util v0.3.17
   Compiling num-integer v0.1.44
   Compiling ahash v0.7.6
   Compiling nom v7.0.0
   Compiling lexical-util v0.8.1
   Compiling html-escape v0.2.9
   Compiling http v0.2.5
   Compiling lexical-write-integer v0.8.0
   Compiling lexical-parse-integer v0.8.0
   Compiling quote v1.0.10
   Compiling time v0.1.43
   Compiling lexical-write-float v0.8.2
   Compiling lexical-parse-float v0.8.2
   Compiling lexical-core v0.8.2
   Compiling chrono v0.4.19
   Compiling lexical v6.0.1
   Compiling wasm-bindgen-backend v0.2.78
   Compiling darling_core v0.13.0
error: could not compile `syn`

Caused by:
  process didn't exit successfully: `rustc --crate-name syn --edition=2018 /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.81/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debug-assertions=off --cfg 'feature="clone-impls"' --cfg 'feature="default"' --cfg 'feature="derive"' --cfg 'feature="extra-traits"' --cfg 'feature="full"' --cfg 'feature="parsing"' --cfg 'feature="printing"' --cfg 'feature="proc-macro"' --cfg 'feature="quote"' --cfg 'feature="visit"' --cfg 'feature="visit-mut"' -C metadata=9e13baa20de7a851 -C extra-filename=-9e13baa20de7a851 --out-dir /app/tiny/.perseus/target/release/deps -L dependency=/app/tiny/.perseus/target/release/deps --extern proc_macro2=/app/tiny/.perseus/target/release/deps/libproc_macro2-cab6106af7d326c8.rmeta --extern quote=/app/tiny/.perseus/target/release/deps/libquote-06c3e2dc93d8e69e.rmeta --extern unicode_xid=/app/tiny/.perseus/target/release/deps/libunicode_xid-0770809ab462d12c.rmeta --cap-lints allow --cfg syn_no_negative_literal_parse --cfg syn_disable_nightly_tests` (signal: 9, SIGKILL: kill)
warning: build failed, waiting for other jobs to finish...
error: build failed
Error: Compiling your crate to WebAssembly failed
Caused by: failed to execute `cargo build`: exited with exit status: 101
  full command: "cargo" "build" "--lib" "--release" "--target" "wasm32-unknown-unknown"
ERROR: Service 'perseus' failed to build : The command '/bin/sh -c perseus deploy' returned a non-zero code: 1

Expected behavior
perseus deploy to perform successfully at least for the version 0.3.0-beta.14.

Screenshots
None.

Environment (please complete the following information):

  • Perseus Version: 0.3.0-beta.14
  • Sycamore Version: 0.6.0
  • OS: both docker hosts run debian 10
  • Browser: Not relevant
  • Browser Version: Not relevant

Additional context
The Dockerfile above isn't using the perseus-size-opt plugin, but instead adds wee_alloc optimizations manually.

`0.3.0-beta.6`: expected struct `Locales`, found struct `perseus::locales::Locales`

Describe the bug
With perseus 0.3.0-beta.6 getting compilation time error expected struct Locales, found struct perseus::locales::Locales

To Reproduce

Cargo.toml

[package]
name = "perseus-tiny"
version = "0.1.0"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
perseus = "0.3.0-beta.6"
sycamore = "0.6"
wee_alloc = "0.4"

[profile.release]
# Do not perform backtrace for panic on release builds.
panic = 'abort'
# Perform optimizations on all codegen units.
codegen-units = 1
# Optimize for size.
opt-level = 's' # 's' or 'z' to optimize "aggressively" for size
# Enable link time optimization. Does not work with Netlify.
lto = true

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Perseus Example – Tiny</title>
    <link data-trunk rel="rust" data-wasm-opt="s" />
</head>

<body>
    <div id="root"></div>
</body>

</html>

src/lib.rs

#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

use perseus::{define_app, ErrorPages, Template};
use std::rc::Rc;
use sycamore::template;
define_app! {
    templates: [
        Template::<G>::new("index").template(Rc::new(|_| {
            template! {
                p { "Hello World!!" }
            }
        }))
    ],
    error_pages: ErrorPages::new(Rc::new(|url, status, err, _| {
        template! {
            p { (format!("An error with HTTP code {} occurred at '{}': '{}'.", status, url, err)) }
        }
    }))
}

console output

user@debian:~/cargo-projects/perseus-tiny$ perseus serve
  [1/4] 🔨 Generating your app...❌
⠁ [2/4] 🏗️  Building your app to Wasm...
⠁ [3/4] 📡 Building server...
    Blocking waiting for file lock on package cache
    Updating crates.io index
    Blocking waiting for file lock on package cache
    Blocking waiting for file lock on package cache
    Blocking waiting for file lock on package cache
   Compiling perseus-macro v0.3.0-beta.6
   Compiling perseus v0.3.0-beta.6
   Compiling perseus-tiny v0.1.0 (/home/user/cargo-projects/perseus-tiny)
   Compiling perseus-cli-builder v0.2.3 (/home/user/cargo-projects/perseus-tiny/.perseus)
error[E0308]: mismatched types
  --> src/lib.rs:41:61
   |
41 |         Rc::new(RefCell::new(ClientTranslationsManager::new(&get_locales())));
   |                                                             ^^^^^^^^^^^^^^ expected struct `Locales`, found struct `perseus::locales::Locales`
   |
   = note: expected reference `&Locales`
              found reference `&perseus::locales::Locales`
   = note: perhaps two different versions of crate `perseus` are being used?

error[E0308]: mismatched types
  --> src/lib.rs:78:47
   |
78 | ...                   Rc::clone(&error_pages),
   |                                 ^^^^^^^^^^^^ expected struct `ErrorPages`, found struct `perseus::error_pages::ErrorPages`
   |
   = note: expected reference `&Rc<ErrorPages<DomNode>>`
              found reference `&Rc<perseus::error_pages::ErrorPages<_>>`
   = note: perhaps two different versions of crate `perseus` are being used?

error[E0308]: mismatched types
  --> src/lib.rs:85:100
   |
85 | ...                   RouteVerdict::LocaleDetection(path) => detect_locale(path.clone(), get_locales()),
   |                                                                                          ^^^^^^^^^^^^^ expected struct `Locales`, found struct `perseus::locales::Locales`
   |
   = note: perhaps two different versions of crate `perseus` are being used?

error[E0308]: mismatched types
  --> src/lib.rs:50:22
   |
50 |         templates => &get_templates_map(),
   |                      ^^^^^^^^^^^^^^^^^^^^ expected struct `perseus::Template`, found struct `perseus::template::Template`
   |
   = note: expected reference `&HashMap<String, perseus::Template<_>>`
              found reference `&HashMap<String, perseus::template::Template<_>>`
   = note: perhaps two different versions of crate `perseus` are being used?

error[E0308]: mismatched types
  --> src/lib.rs:51:20
   |
51 |         locales => &get_locales()
   |                    ^^^^^^^^^^^^^^ expected struct `Locales`, found struct `perseus::locales::Locales`
   |
   = note: expected reference `&Locales`
              found reference `&perseus::locales::Locales`
   = note: perhaps two different versions of crate `perseus` are being used?
  [1/4] 🔨 Generating your app...❌
  [2/4] 🏗️  Building your app to Wasm...❌
⠠ [3/4] 📡 Building server...
[INFO]: Checking for the Wasm target...
[INFO]: Compiling to Wasm...
   Compiling perseus-macro v0.3.0-beta.6
   Compiling perseus v0.3.0-beta.6
   Compiling perseus-tiny v0.1.0 (/home/user/cargo-projects/perseus-tiny)
   Compiling perseus-cli-builder v0.2.3 (/home/user/cargo-projects/perseus-tiny/.perseus)
error[E0308]: mismatched types
  --> src/lib.rs:41:61
   |
41 |         Rc::new(RefCell::new(ClientTranslationsManager::new(&get_locales())));
   |                                                             ^^^^^^^^^^^^^^ expected struct `Locales`, found struct `perseus::locales::Locales`
   |
   = note: expected reference `&Locales`
              found reference `&perseus::locales::Locales`
   = note: perhaps two different versions of crate `perseus` are being used?

error[E0308]: mismatched types
  --> src/lib.rs:78:47
   |
78 | ...                   Rc::clone(&error_pages),
   |                                 ^^^^^^^^^^^^ expected struct `ErrorPages`, found struct `perseus::error_pages::ErrorPages`
   |
   = note: expected reference `&Rc<ErrorPages<DomNode>>`
              found reference `&Rc<perseus::error_pages::ErrorPages<_>>`
   = note: perhaps two different versions of crate `perseus` are being used?

error[E0308]: mismatched types
  --> src/lib.rs:85:100
   |
85 | ...                   RouteVerdict::LocaleDetection(path) => detect_locale(path.clone(), get_locales()),
   |                                                                                          ^^^^^^^^^^^^^ expected struct `Locales`, found struct `perseus::locales::Locales`
   |
   = note: perhaps two different versions of crate `perseus` are being used?

error[E0308]: mismatched types
  --> src/lib.rs:50:22
   |
50 |         templates => &get_templates_map(),
   |                      ^^^^^^^^^^^^^^^^^^^^ expected struct `perseus::Template`, found struct `perseus::template::Template`
   |
   = note: expected reference `&HashMap<String, perseus::Template<_>>`
              found reference `&HashMap<String, perseus::template::Template<_>>`
   = note: perhaps two different versions of crate `perseus` are being used?

error[E0308]: mismatched types
  --> src/lib.rs:51:20
   |
51 |         locales => &get_locales()
   |                    ^^^^^^^^^^^^^^ expected struct `Locales`, found struct `perseus::locales::Locales`
   |
   = note: expected reference `&Locales`
              found reference `&perseus::locales::Locales`
   = note: perhaps two different versions of crate `perseus` are being used?

For more information about this error, try `rustc --explain E0308`.
error: could not compile `perseus-cli-builder` due to 5 previous errors
Error: Compiling your crate to WebAssembly failed
Caused by: failed to execute `cargo build`: exited with exit status: 101
  full command: "cargo" "build" "--lib" "--release" "--target" "wasm32-unknown-unknown"
user@debian:~/cargo-projects/perseus-tiny$ perseus --version
You are currently running the Perseus CLI v0.2.3! You can see the latest release at https://github.com/arctic-hen7/perseus/releases.

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Environment (please complete the following information):

  • Perseus Version: 0.3.0-beta.6
  • Sycamore Version: 0.6.1
  • OS: debian 10
  • Browser: not relevant
  • Browser Version: not relevant

Additional context
Perseus 0.2.3 compiles successfully.

Note
Brilliant project idea! Wish for Perseus to gain more momentum.

Add more comparisons to website

Is your feature request related to a problem? Please describe.
Right now, the website has comparisons between Perseus and only two other frameworks: Gatsby and NextJS. This is very much sub-optimal, and as many comparisons as possible should be included.

Describe the solution you'd like
More comparisons should be added, here are some (this list will be extended):

  • Yew
  • Seed
  • CRA (create-react-app)
  • Eleventy
  • Hugo
  • Jekyll
  • Zola
  • MoonZoon

`perseus clean` panics at index out of bounds

Describe the bug
Whenever running perseus clean without the --dist flag, the thread will panic because it uses [1] to check if --dist is present instead of .get(0).

To Reproduce
Run perseus clean.

Expected behavior
The command should succeed.

Screenshots
If applicable, add screenshots to help explain your problem.

Environment (please complete the following information):

  • Perseus Version: v0.2.3
  • Sycamore Version: [v0.6.1
  • OS: Ubuntu
  • Browser: N/A
  • Browser Version: N/A

Additional context
Add any other context about the problem here.

Remove/Replace Rollup.js

It would be good to have the option to do without Rollup.js and npm entirely. At least in my case i am searching for Rust frontend tools because i want to stay away from npm and its ecosystem. I don't want to go into details about the "why" here, but i am wondering what alternatives we have. I am not very familiar with perseus yet and going through the book Building Your First App i was unpleasantly surprised to see npm i -g rollup which is a show-stopper in my case. I don't want to elevate this as a major problem for the project, because its just my personal taste – but i am wondering if we could have an easy to integrate (rusty) alternative that is as powerful as Rollup.js yet and can serve the same needs. I am very happy with Trunk and Sycamore/seed-rs/yew and was wondering what exactly is different here that make Rollup.js mandatory.

Improve performance of locale redirection

Is your feature request related to a problem? Please describe.
Right now, locale redirection is really slow. This doesn't factor into the Lighthouse outcome, because it's considered a redirection, but it radically slows down load times. This is because the locale redirection happens in the same bundle as everything else, which we then have to re-download when we run window.location.replace().

Describe the solution you'd like
Perseus should redirect the user to the correct page within Sycamore, avoiding reloading anything (using subsequent loads instead). This will require Sycamore to have a feature for navigating and replacing the current URL (an important distinction for the browser).

Describe alternatives you've considered
Perseus should create a separate executable file for locale redirection, and serve this only for initial loads. However, this is still more downloading work, and is sub-optimal.

Additional context
Add any other context or screenshots about the feature request here.

First-time CLI builds are really slow

The first time the CLI builds, it takes a very long time to complete. These are the stages it goes through for perseus serve:

  • Build all dependencies and the user's code (long)
  • Run static generation (almost instantaneous)
  • Build for Wasm (long)
  • Organize bundle (very quick)
  • Build all server dependencies and the user's code (long)
  • Run the server (almost instantaneous)

There are a few infrastructure changes I want to propose to shorten first-time builds (and all further builds for that matter). First, a workspace should be constructed in the preparation stage so that the two subcrates share a target/ directory, which means the server doesn't need to rebuild everything. Second, run the build for static generation and the Wasm build in parallel (which can be done for different targets).

These changes should significantly reduce initial build times, and further reduce later builds, making Perseus even faster in development. By increasing iteration time, we increase develop productivity, meaning people focus more on their own code and less on waiting at their terminals.

  • Create workspace at runtime
  • Parallelize builds

Add release mode to CLI

Is your feature request related to a problem? Please describe.
At the moment, there's deliberately no way to run a Perseus app in production with the CLI, because it doesn't allow you to build the server in release mode. Perseus is now mature enough for this to be supported in v0.3.0, and this would allow deployment of Perseus on a traditional server with write filesystem access.

Describe the solution you'd like
The CLI commands build, serve, and export should all have a --release flag that builds the Rust/Wasm code for production.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
This also means that the deployment section of the docs can be opened up with further details.

Parsing Youtube video script or network error?

Perseus is going into the mainstream, while I'm impatient to use it in production, I managed to build a production-ready application.

Describe the bug
I was able to load the Youtube video script but not able to play it. I can't figure out what's blocking it.

Expected behavior
It's a Background video which should be played, I have already tried on the local template which works perfectly.

Screenshots
https://github.com/afidegnum/frontend/blob/main/src/templates/index.rs#L17-L54

Add purely static export

Is your feature request related to a problem? Please describe.
Perseus is currently not technically JAMstack because it doesn't support eliminating server-side code. Many Perseus sites only rely on build-time rendering strategies, and performance would be improved if we could export to purely static files.

Describe the solution you'd like
The Perseus CLI should have an export command that creates a purely static set of files that can be served from anywhere, like a CDN, without any dependency on a server.

Describe alternatives you've considered
Zola is a great alternative in the meantime, but being able to have this work with Perseus would be a huge plus, and would get the project even with NextJS on JAMstack support.

Additional context
Add any other context or screenshots about the feature request here.

Rationalize Perseus idioms

Is your feature request related to a problem? Please describe.
If you take three seconds to go through the Perseus idiom of defining functions that return closures within Rcs, you'll probably stop liking it pretty quickly, because it's grotesque. Besides, we can trivially just have those closures as functions themselves that are then placed in Rcs (which is also an idiom, but only for some things...).

Describe the solution you'd like
In short, these idioms need to start making sense! A lot of them are left over from the old architecture of v0.1.0 and even before that, and they should be updated in the documentation and examples to reflect better practice (which is more concise and logical).

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
This is primarily a documentation change, but it's a very big one, and it'll be released in v0.3.0.

Prerender document `<head>` at build time

Is your feature request related to a problem? Please describe.
Currently, Perseus renders the document <head> at runtime only, which, though hardly a huge thing, does mean the server ha to do more.

Describe the solution you'd like
At build time, any templates with compatible strategies should have their <head>s prerendered to a .head.html asset, which can be read by the server and interpolated, meaning the server has to do less work. Notably, the generation function for the <head> is deliberately synchronous, and takes state, but it does render to a string, so it makes sense to prerender it if possible, which might give performance improvements of a few milliseconds. This also makes static exporting significantly easier.

Describe alternatives you've considered
At the moment, there's no way to prerender metadata in Perseus, or (to my knowledge) any other Rust framework.

Additional context
Add any other context or screenshots about the feature request here.

Separate mutable from immutable data

Is your feature request related to a problem? Please describe.
Presently, Perseus can't be deployed as a fully-fledged server to platforms that only support read-only filesystems, like Netlify, because the revalidation and incremental generation strategies require write access to the filesystem. A solution to this is config managers, but they're mostly a legacy item from v0.1.x, and need modernization.

Describe the solution you'd like
Perseus should separate incremental generation and revalidation data from immutable data generated at build-time. That way, the immutable stuff always uses the filesystem, and the mutable stuff can use a config manager. This will improve performance for sites that want to use these strategies and deploy to modern providers.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
This would require significant modifications to the existing configuration managers system, the define_app! macro, and the building/serving systems to support a separation of concerns. This would also require documentation changes that are more geared towards users understanding this issue so that they can plan for it and set up configuration managers that work for them.

We should also engage with hosting providers and see what their options are and will be on low-latency mutable data stores in future, but this minimizes the amount of changes Perseus may have to endure, and also minimizes the amount of data that will need to be stored.

Add native i18n support

Perseus should be able to support i18n effortlessly and without increasing build times.

I propose this is done by not changing any part of the existing build mechanism (yet), but simply by adding a section on the server that replaces all translation IDs, indicated maybe by <-translation.id.here->, with their translation at request-time, then caching the translated HTML/JSON files for future usage for that page and locale combination. This is essentially a very specialized use-case of incremental rendering combined with the build paths strategy, that I would propose deliberately isolating from the rest of the build matrix to improve simplicity and maintainability. Caching as described would also mean that build times wouldn't increase at all, unless some particular locales need to be pre-rendered for for certain pages, which could be specified in the define_app! macro.

The problem with this find-and-replace approach is of course that any translations dynamically added on the client by the Wasm code won't be translated. So, a struct could be passed to every template that provides a method for translation and stores the translations for the current locale (the app shell would instantiate this on loading a new locale). Then, every translation is wrapped in this (as in just about every other i18n library ever), and it then works! But, we optimize even further by combining this with the previous strategy and then simply checking in the function if its parameter is properly indicated as a translation ID. If not, it's been replaced at build and so we don't need to do anything.

This would also be friendly to a future exporting system because the request-time translation process could simply be performed for every page in an exporting process, leaving the user with a purely static site if they don't need more complex request-time rendering strategies.

  • Add support for translators
  • Feature-gate translator API to prevent locking users in
  • Integrate with Fluent
  • Make changes necessary to app definition systems
  • Implement translations caching
  • Create macros to make translation easy
  • Create locale detection systems

Make render functions work with any error

Is your feature request related to a problem? Please describe.
Right now, render functions like those for the build state strategy need to have String as the error type. That's not only annoying for any crate with its own errors, it encourages .unwrap()s where they're not safe (not mentioning any names all the examples!).

Describe the solution you'd like
Render functions should accept a Box<dyn std::error::Error> as a return type, and ErrorCause should be able to be defined as blaming the server automatically with ? if it's not explicitly specified.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
This would be a breaking change, and will be released in v0.3.0.

Template roots don't render with initial loads for static exporting, sometimes

Describe the bug
Right now, perseus export will generate templates that have many pages in a rather strange way (actually quite unintended, just a quirk of the system). Let's say we have a template docs, which has a root page and a ton of other subpages. Those subpages will all be exported into a docs/ folder, which is logical, but the root page won't be at docs/index.html, it'll be at docs.html (outside docs/). Unfortunately, different systems handle this in different ways, though most simply won't find the /docs page. Note that the subsequent loads system works fine because the internal Perseus structure is expected to work like this.

To Reproduce
Steps to reproduce the behavior:

  1. Go to https://arctic-hen7.github.io/perseus/en-US/docs/ to see this in production.
    or
  2. Go to https://arctic-hen7.github.io/perseus and click on the Docs link, which will work.

Expected behavior
Template roots should be rendered in the template's folder as index.html for the initial loads system, and such pages should be able to be rendered.

Screenshots
If applicable, add screenshots to help explain your problem.

Environment (please complete the following information):

  • Perseus Version: v0.3.0-beta.17 (affects all versions since exporting was introduced though)
  • Sycamore Version: v0.6
  • OS: Ubuntu
  • Browser: Firefox
  • Browser Version:93

Additional context
Add any other context about the problem here.

`perseus deploy` Compiling perseus-cli-server crashes due to not enough memory

Describe the bug
Bellow is all the info I could gather. The compilation error happens only on the VPS where I tried to do the production deployment and only after optimizations are added to the .perseus/Cargo.toml file. With those optimizations in place and while deploying on the VPS this procedure of compiler crash is repeatable every time exactly at the Compiling perseus-cli-server step.

To Reproduce

user@debian-cpx11:~$ mkdir ./docker-perseus
user@debian-cpx11:~$ cat > ./docker-perseus/Dockerfile <<EOL
> # get the base image
> FROM rust:1.55-slim AS build
> 
> # install build dependencies
> RUN apt update \
>   && apt install -y --no-install-recommends lsb-release apt-transport-https \
>   git inotify-tools ca-certificates build-essential make gcc curl
> 
> # prepare root project dir
> WORKDIR /app
> 
> # download the target for wasm
> RUN rustup target add wasm32-unknown-unknown
> 
> # install wasm-pack
> RUN cargo install wasm-pack
> 
> # retrieve the src dir
> RUN curl https://codeload.github.com/arctic-hen7/perseus/tar.gz/main | tar -xz --strip=2
perseus-main/examples/showcase
> 
> # go to src dir
> WORKDIR /app/showcase
> 
> # install perseus-cli
> RUN cargo install perseus-cli --version 0.3.0-beta.12
> 
> # clean app
> RUN perseus clean
> 
> # adjust app config
> RUN sed -i s'/perseus = .*/perseus = "0.3.0-beta.12"/' ./Cargo.toml \
>   && sed -i '/\[dependencies\]/a wee_alloc = "0.4"' ./Cargo.toml
> 
> # append app config
> RUN echo ' \n\
> [profile.release] \n\
> opt-level = "s" \n\
> lto = true ' >> ./Cargo.toml \
>   && cat ./Cargo.toml
> 
> # prepend lib.rs
> RUN echo '#[global_allocator] \n\
> static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; \n\
> ' | cat - ./src/lib.rs > ./src/lib.rs.tmp \
>   && mv ./src/lib.rs.tmp ./src/lib.rs \
>   && cat ./src/lib.rs
> 
> # prep app
> RUN perseus prep
> 
> # adjust and append perseus config <<== this step makes `perseus deploy` fail
> RUN sed -i s'/perseus = .*/perseus = "0.3.0-beta.12"/' .perseus/Cargo.toml \
>   && echo ' \n\n\
> [profile.release] \n\
> opt-level = "s" \n\
> lto = true ' >> .perseus/Cargo.toml \
>   && cat .perseus/Cargo.toml
> 
> # deploy app
> RUN perseus deploy
> 
> # prepare deployment image
> FROM debian:bullseye-slim
> 
> WORKDIR /app
> 
> COPY --from=build /app/showcase/pkg /app/
> 
> ENV PERSEUS_STANDALONE=true
> 
> ENV HOST=0.0.0.0
> 
> CMD ["./server"]
> EOL
user@debian-cpx11:~$ docker build -t perseus-showcase:2021-10-17 ./docker-perseus
Sending build context to Docker daemon  44.54kB
Step 1/21 : FROM rust:1.55-slim AS build
---> 1ee58c5365b4
Step 2/21 : RUN apt update   && apt install -y --no-install-recommends lsb-release apt-transport-https   git
inotify-tools ca-certificates build-essential make gcc curl
---> Running in 23bbc2cf7896

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Get:1 http://security.debian.org/debian-security bullseye-security InRelease [44.1 kB]
Get:2 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:3 http://deb.debian.org/debian bullseye-updates InRelease [39.4 kB]
Get:4 http://security.debian.org/debian-security bullseye-security/main amd64 Packages [70.3 kB]
Get:5 http://deb.debian.org/debian bullseye/main amd64 Packages [8180 kB]
Get:6 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [2300 B]
Fetched 8452 kB in 2s (3638 kB/s)
Reading package lists...
Building dependency tree...
Reading state information...
All packages are up to date.

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Reading package lists...
Building dependency tree...
Reading state information...
ca-certificates is already the newest version (20210119).
gcc is already the newest version (4:10.2.1-1).
The following additional packages will be installed:
bzip2 distro-info-data dpkg-dev g++ g++-10 git-man libbrotli1
libcurl3-gnutls libcurl4 libdpkg-perl liberror-perl libexpat1
libgdbm-compat4 libgdbm6 libinotifytools0 libldap-2.4-2 libmpdec3
libncursesw6 libnghttp2-14 libperl5.32 libpsl5 libpython3-stdlib
libpython3.9-minimal libpython3.9-stdlib libreadline8 librtmp1 libsasl2-2
libsasl2-modules-db libsqlite3-0 libssh2-1 libstdc++-10-dev media-types
patch perl perl-modules-5.32 python3 python3-minimal python3.9
python3.9-minimal readline-common xz-utils
Suggested packages:
bzip2-doc debian-keyring g++-multilib g++-10-multilib gcc-10-doc
gettext-base git-daemon-run | git-daemon-sysvinit git-doc git-el git-email
git-gui gitk gitweb git-cvs git-mediawiki git-svn gnupg sensible-utils bzr
gdbm-l10n libstdc++-10-doc make-doc ed diffutils-doc perl-doc
libterm-readline-gnu-perl | libterm-readline-perl-perl
libtap-harness-archive-perl python3-doc python3-tk python3-venv
python3.9-venv python3.9-doc binfmt-support readline-doc
Recommended packages:
fakeroot gnupg libalgorithm-merge-perl less ssh-client
libfile-fcntllock-perl liblocale-gettext-perl libldap-common libgpm2
publicsuffix libsasl2-modules netbase
The following NEW packages will be installed:
apt-transport-https build-essential bzip2 curl distro-info-data dpkg-dev g++
g++-10 git git-man inotify-tools libbrotli1 libcurl3-gnutls libcurl4
libdpkg-perl liberror-perl libexpat1 libgdbm-compat4 libgdbm6
libinotifytools0 libldap-2.4-2 libmpdec3 libncursesw6 libnghttp2-14
libperl5.32 libpsl5 libpython3-stdlib libpython3.9-minimal
libpython3.9-stdlib libreadline8 librtmp1 libsasl2-2 libsasl2-modules-db
libsqlite3-0 libssh2-1 libstdc++-10-dev lsb-release make media-types patch
perl perl-modules-5.32 python3 python3-minimal python3.9 python3.9-minimal
readline-common xz-utils
0 upgraded, 48 newly installed, 0 to remove and 0 not upgraded.
Need to get 38.9 MB of archives.
After this operation, 167 MB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bullseye/main amd64 perl-modules-5.32 all 5.32.1-4+deb11u2 [2823 kB]
Get:2 http://deb.debian.org/debian bullseye/main amd64 libgdbm6 amd64 1.19-2 [64.9 kB]
Get:3 http://deb.debian.org/debian bullseye/main amd64 libgdbm-compat4 amd64 1.19-2 [44.7 kB]
Get:4 http://deb.debian.org/debian bullseye/main amd64 libperl5.32 amd64 5.32.1-4+deb11u2 [4106 kB]
Get:5 http://deb.debian.org/debian bullseye/main amd64 perl amd64 5.32.1-4+deb11u2 [293 kB]
Get:6 http://deb.debian.org/debian bullseye/main amd64 libpython3.9-minimal amd64 3.9.2-1 [801 kB]
Get:7 http://deb.debian.org/debian bullseye/main amd64 libexpat1 amd64 2.2.10-2 [96.9 kB]
Get:8 http://deb.debian.org/debian bullseye/main amd64 python3.9-minimal amd64 3.9.2-1 [1955 kB]
Get:9 http://deb.debian.org/debian bullseye/main amd64 python3-minimal amd64 3.9.2-3 [38.2 kB]
Get:10 http://deb.debian.org/debian bullseye/main amd64 media-types all 4.0.0 [30.3 kB]
Get:11 http://deb.debian.org/debian bullseye/main amd64 libmpdec3 amd64 2.5.1-1 [87.7 kB]
Get:12 http://deb.debian.org/debian bullseye/main amd64 libncursesw6 amd64 6.2+20201114-2 [132 kB]
Get:13 http://deb.debian.org/debian bullseye/main amd64 readline-common all 8.1-1 [73.7 kB]
Get:14 http://deb.debian.org/debian bullseye/main amd64 libreadline8 amd64 8.1-1 [169 kB]
Get:15 http://deb.debian.org/debian bullseye/main amd64 libsqlite3-0 amd64 3.34.1-3 [797 kB]
Get:16 http://deb.debian.org/debian bullseye/main amd64 libpython3.9-stdlib amd64 3.9.2-1 [1684 kB]
Get:17 http://deb.debian.org/debian bullseye/main amd64 python3.9 amd64 3.9.2-1 [466 kB]
Get:18 http://deb.debian.org/debian bullseye/main amd64 libpython3-stdlib amd64 3.9.2-3 [21.4 kB]
Get:19 http://deb.debian.org/debian bullseye/main amd64 python3 amd64 3.9.2-3 [37.9 kB]
Get:20 http://deb.debian.org/debian bullseye/main amd64 bzip2 amd64 1.0.8-4 [49.3 kB]
Get:21 http://deb.debian.org/debian bullseye/main amd64 xz-utils amd64 5.2.5-2 [220 kB]
Get:22 http://deb.debian.org/debian bullseye/main amd64 apt-transport-https all 2.2.4 [160 kB]
Get:23 http://deb.debian.org/debian bullseye/main amd64 libstdc++-10-dev amd64 10.2.1-6 [1741 kB]
Get:24 http://deb.debian.org/debian bullseye/main amd64 g++-10 amd64 10.2.1-6 [9380 kB]
Get:25 http://deb.debian.org/debian bullseye/main amd64 g++ amd64 4:10.2.1-1 [1644 B]
Get:26 http://deb.debian.org/debian bullseye/main amd64 make amd64 4.3-4.1 [396 kB]
Get:27 http://deb.debian.org/debian bullseye/main amd64 libdpkg-perl all 1.20.9 [1537 kB]
Get:28 http://deb.debian.org/debian bullseye/main amd64 patch amd64 2.7.6-7 [128 kB]
Get:29 http://deb.debian.org/debian bullseye/main amd64 dpkg-dev all 1.20.9 [2153 kB]
Get:30 http://deb.debian.org/debian bullseye/main amd64 build-essential amd64 12.9 [7704 B]
Get:31 http://deb.debian.org/debian bullseye/main amd64 libbrotli1 amd64 1.0.9-2+b2 [279 kB]
Get:32 http://deb.debian.org/debian bullseye/main amd64 libsasl2-modules-db amd64 2.1.27+dfsg-2.1 [69.1 kB]
Get:33 http://deb.debian.org/debian bullseye/main amd64 libsasl2-2 amd64 2.1.27+dfsg-2.1 [106 kB]
Get:34 http://deb.debian.org/debian bullseye/main amd64 libldap-2.4-2 amd64 2.4.57+dfsg-3 [232 kB]
Get:35 http://deb.debian.org/debian bullseye/main amd64 libnghttp2-14 amd64 1.43.0-1 [77.1 kB]
Get:36 http://deb.debian.org/debian bullseye/main amd64 libpsl5 amd64 0.21.0-1.2 [57.3 kB]
Get:37 http://deb.debian.org/debian bullseye/main amd64 librtmp1 amd64 2.4+20151223.gitfa8646d.1-2+b2 [60.8 kB]
Get:38 http://deb.debian.org/debian bullseye/main amd64 libssh2-1 amd64 1.9.0-2 [156 kB]
Get:39 http://deb.debian.org/debian bullseye/main amd64 libcurl4 amd64 7.74.0-1.3+b1 [341 kB]
Get:40 http://deb.debian.org/debian bullseye/main amd64 curl amd64 7.74.0-1.3+b1 [267 kB]
Get:41 http://deb.debian.org/debian bullseye/main amd64 distro-info-data all 0.51 [7508 B]
Get:42 http://deb.debian.org/debian bullseye/main amd64 libcurl3-gnutls amd64 7.74.0-1.3+b1 [338 kB]
Get:43 http://deb.debian.org/debian bullseye/main amd64 liberror-perl all 0.17029-1 [31.0 kB]
Get:44 http://deb.debian.org/debian bullseye/main amd64 git-man all 1:2.30.2-1 [1827 kB]
Get:45 http://deb.debian.org/debian bullseye/main amd64 git amd64 1:2.30.2-1 [5527 kB]
Get:46 http://deb.debian.org/debian bullseye/main amd64 libinotifytools0 amd64 3.14-8.1 [18.9 kB]
Get:47 http://deb.debian.org/debian bullseye/main amd64 inotify-tools amd64 3.14-8.1 [25.9 kB]
Get:48 http://deb.debian.org/debian bullseye/main amd64 lsb-release all 11.1.0 [27.9 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 38.9 MB in 0s (111 MB/s)
Selecting previously unselected package perl-modules-5.32.
(Reading database ... 9284 files and directories currently installed.)
Preparing to unpack .../0-perl-modules-5.32_5.32.1-4+deb11u2_all.deb ...
Unpacking perl-modules-5.32 (5.32.1-4+deb11u2) ...
Selecting previously unselected package libgdbm6:amd64.
Preparing to unpack .../1-libgdbm6_1.19-2_amd64.deb ...
Unpacking libgdbm6:amd64 (1.19-2) ...
Selecting previously unselected package libgdbm-compat4:amd64.
Preparing to unpack .../2-libgdbm-compat4_1.19-2_amd64.deb ...
Unpacking libgdbm-compat4:amd64 (1.19-2) ...
Selecting previously unselected package libperl5.32:amd64.
Preparing to unpack .../3-libperl5.32_5.32.1-4+deb11u2_amd64.deb ...
Unpacking libperl5.32:amd64 (5.32.1-4+deb11u2) ...
Selecting previously unselected package perl.
Preparing to unpack .../4-perl_5.32.1-4+deb11u2_amd64.deb ...
Unpacking perl (5.32.1-4+deb11u2) ...
Selecting previously unselected package libpython3.9-minimal:amd64.
Preparing to unpack .../5-libpython3.9-minimal_3.9.2-1_amd64.deb ...
Unpacking libpython3.9-minimal:amd64 (3.9.2-1) ...
Selecting previously unselected package libexpat1:amd64.
Preparing to unpack .../6-libexpat1_2.2.10-2_amd64.deb ...
Unpacking libexpat1:amd64 (2.2.10-2) ...
Selecting previously unselected package python3.9-minimal.
Preparing to unpack .../7-python3.9-minimal_3.9.2-1_amd64.deb ...
Unpacking python3.9-minimal (3.9.2-1) ...
Setting up libpython3.9-minimal:amd64 (3.9.2-1) ...
Setting up libexpat1:amd64 (2.2.10-2) ...
Setting up python3.9-minimal (3.9.2-1) ...
Selecting previously unselected package python3-minimal.
(Reading database ... 11549 files and directories currently installed.)
Preparing to unpack .../0-python3-minimal_3.9.2-3_amd64.deb ...
Unpacking python3-minimal (3.9.2-3) ...
Selecting previously unselected package media-types.
Preparing to unpack .../1-media-types_4.0.0_all.deb ...
Unpacking media-types (4.0.0) ...
Selecting previously unselected package libmpdec3:amd64.
Preparing to unpack .../2-libmpdec3_2.5.1-1_amd64.deb ...
Unpacking libmpdec3:amd64 (2.5.1-1) ...
Selecting previously unselected package libncursesw6:amd64.
Preparing to unpack .../3-libncursesw6_6.2+20201114-2_amd64.deb ...
Unpacking libncursesw6:amd64 (6.2+20201114-2) ...
Selecting previously unselected package readline-common.
Preparing to unpack .../4-readline-common_8.1-1_all.deb ...
Unpacking readline-common (8.1-1) ...
Selecting previously unselected package libreadline8:amd64.
Preparing to unpack .../5-libreadline8_8.1-1_amd64.deb ...
Unpacking libreadline8:amd64 (8.1-1) ...
Selecting previously unselected package libsqlite3-0:amd64.
Preparing to unpack .../6-libsqlite3-0_3.34.1-3_amd64.deb ...
Unpacking libsqlite3-0:amd64 (3.34.1-3) ...
Selecting previously unselected package libpython3.9-stdlib:amd64.
Preparing to unpack .../7-libpython3.9-stdlib_3.9.2-1_amd64.deb ...
Unpacking libpython3.9-stdlib:amd64 (3.9.2-1) ...
Selecting previously unselected package python3.9.
Preparing to unpack .../8-python3.9_3.9.2-1_amd64.deb ...
Unpacking python3.9 (3.9.2-1) ...
Selecting previously unselected package libpython3-stdlib:amd64.
Preparing to unpack .../9-libpython3-stdlib_3.9.2-3_amd64.deb ...
Unpacking libpython3-stdlib:amd64 (3.9.2-3) ...
Setting up python3-minimal (3.9.2-3) ...
Selecting previously unselected package python3.
(Reading database ... 11987 files and directories currently installed.)
Preparing to unpack .../00-python3_3.9.2-3_amd64.deb ...
Unpacking python3 (3.9.2-3) ...
Selecting previously unselected package bzip2.
Preparing to unpack .../01-bzip2_1.0.8-4_amd64.deb ...
Unpacking bzip2 (1.0.8-4) ...
Selecting previously unselected package xz-utils.
Preparing to unpack .../02-xz-utils_5.2.5-2_amd64.deb ...
Unpacking xz-utils (5.2.5-2) ...
Selecting previously unselected package apt-transport-https.
Preparing to unpack .../03-apt-transport-https_2.2.4_all.deb ...
Unpacking apt-transport-https (2.2.4) ...
Selecting previously unselected package libstdc++-10-dev:amd64.
Preparing to unpack .../04-libstdc++-10-dev_10.2.1-6_amd64.deb ...
Unpacking libstdc++-10-dev:amd64 (10.2.1-6) ...
Selecting previously unselected package g++-10.
Preparing to unpack .../05-g++-10_10.2.1-6_amd64.deb ...
Unpacking g++-10 (10.2.1-6) ...
Selecting previously unselected package g++.
Preparing to unpack .../06-g++_4%3a10.2.1-1_amd64.deb ...
Unpacking g++ (4:10.2.1-1) ...
Selecting previously unselected package make.
Preparing to unpack .../07-make_4.3-4.1_amd64.deb ...
Unpacking make (4.3-4.1) ...
Selecting previously unselected package libdpkg-perl.
Preparing to unpack .../08-libdpkg-perl_1.20.9_all.deb ...
Unpacking libdpkg-perl (1.20.9) ...
Selecting previously unselected package patch.
Preparing to unpack .../09-patch_2.7.6-7_amd64.deb ...
Unpacking patch (2.7.6-7) ...
Selecting previously unselected package dpkg-dev.
Preparing to unpack .../10-dpkg-dev_1.20.9_all.deb ...
Unpacking dpkg-dev (1.20.9) ...
Selecting previously unselected package build-essential.
Preparing to unpack .../11-build-essential_12.9_amd64.deb ...
Unpacking build-essential (12.9) ...
Selecting previously unselected package libbrotli1:amd64.
Preparing to unpack .../12-libbrotli1_1.0.9-2+b2_amd64.deb ...
Unpacking libbrotli1:amd64 (1.0.9-2+b2) ...
Selecting previously unselected package libsasl2-modules-db:amd64.
Preparing to unpack .../13-libsasl2-modules-db_2.1.27+dfsg-2.1_amd64.deb ...
Unpacking libsasl2-modules-db:amd64 (2.1.27+dfsg-2.1) ...
Selecting previously unselected package libsasl2-2:amd64.
Preparing to unpack .../14-libsasl2-2_2.1.27+dfsg-2.1_amd64.deb ...
Unpacking libsasl2-2:amd64 (2.1.27+dfsg-2.1) ...
Selecting previously unselected package libldap-2.4-2:amd64.
Preparing to unpack .../15-libldap-2.4-2_2.4.57+dfsg-3_amd64.deb ...
Unpacking libldap-2.4-2:amd64 (2.4.57+dfsg-3) ...
Selecting previously unselected package libnghttp2-14:amd64.
Preparing to unpack .../16-libnghttp2-14_1.43.0-1_amd64.deb ...
Unpacking libnghttp2-14:amd64 (1.43.0-1) ...
Selecting previously unselected package libpsl5:amd64.
Preparing to unpack .../17-libpsl5_0.21.0-1.2_amd64.deb ...
Unpacking libpsl5:amd64 (0.21.0-1.2) ...
Selecting previously unselected package librtmp1:amd64.
Preparing to unpack .../18-librtmp1_2.4+20151223.gitfa8646d.1-2+b2_amd64.deb ...
Unpacking librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b2) ...
Selecting previously unselected package libssh2-1:amd64.
Preparing to unpack .../19-libssh2-1_1.9.0-2_amd64.deb ...
Unpacking libssh2-1:amd64 (1.9.0-2) ...
Selecting previously unselected package libcurl4:amd64.
Preparing to unpack .../20-libcurl4_7.74.0-1.3+b1_amd64.deb ...
Unpacking libcurl4:amd64 (7.74.0-1.3+b1) ...
Selecting previously unselected package curl.
Preparing to unpack .../21-curl_7.74.0-1.3+b1_amd64.deb ...
Unpacking curl (7.74.0-1.3+b1) ...
Selecting previously unselected package distro-info-data.
Preparing to unpack .../22-distro-info-data_0.51_all.deb ...
Unpacking distro-info-data (0.51) ...
Selecting previously unselected package libcurl3-gnutls:amd64.
Preparing to unpack .../23-libcurl3-gnutls_7.74.0-1.3+b1_amd64.deb ...
Unpacking libcurl3-gnutls:amd64 (7.74.0-1.3+b1) ...
Selecting previously unselected package liberror-perl.
Preparing to unpack .../24-liberror-perl_0.17029-1_all.deb ...
Unpacking liberror-perl (0.17029-1) ...
Selecting previously unselected package git-man.
Preparing to unpack .../25-git-man_1%3a2.30.2-1_all.deb ...
Unpacking git-man (1:2.30.2-1) ...
Selecting previously unselected package git.
Preparing to unpack .../26-git_1%3a2.30.2-1_amd64.deb ...
Unpacking git (1:2.30.2-1) ...
Selecting previously unselected package libinotifytools0:amd64.
Preparing to unpack .../27-libinotifytools0_3.14-8.1_amd64.deb ...
Unpacking libinotifytools0:amd64 (3.14-8.1) ...
Selecting previously unselected package inotify-tools.
Preparing to unpack .../28-inotify-tools_3.14-8.1_amd64.deb ...
Unpacking inotify-tools (3.14-8.1) ...
Selecting previously unselected package lsb-release.
Preparing to unpack .../29-lsb-release_11.1.0_all.deb ...
Unpacking lsb-release (11.1.0) ...
Setting up media-types (4.0.0) ...
Setting up libinotifytools0:amd64 (3.14-8.1) ...
Setting up libpsl5:amd64 (0.21.0-1.2) ...
Setting up libstdc++-10-dev:amd64 (10.2.1-6) ...
Setting up g++-10 (10.2.1-6) ...
Setting up apt-transport-https (2.2.4) ...
Setting up distro-info-data (0.51) ...
Setting up perl-modules-5.32 (5.32.1-4+deb11u2) ...
Setting up libbrotli1:amd64 (1.0.9-2+b2) ...
Setting up libsqlite3-0:amd64 (3.34.1-3) ...
Setting up libnghttp2-14:amd64 (1.43.0-1) ...
Setting up bzip2 (1.0.8-4) ...
Setting up libsasl2-modules-db:amd64 (2.1.27+dfsg-2.1) ...
Setting up make (4.3-4.1) ...
Setting up librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b2) ...
Setting up xz-utils (5.2.5-2) ...
update-alternatives: using /usr/bin/xz to provide /usr/bin/lzma (lzma) in auto mode
update-alternatives: warning: skip creation of /usr/share/man/man1/lzma.1.gz because associated file
/usr/share/man/man1/xz.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/unlzma.1.gz because associated file
/usr/share/man/man1/unxz.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzcat.1.gz because associated file
/usr/share/man/man1/xzcat.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzmore.1.gz because associated file
/usr/share/man/man1/xzmore.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzless.1.gz because associated file
/usr/share/man/man1/xzless.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzdiff.1.gz because associated file
/usr/share/man/man1/xzdiff.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzcmp.1.gz because associated file
/usr/share/man/man1/xzcmp.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzgrep.1.gz because associated file
/usr/share/man/man1/xzgrep.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzegrep.1.gz because associated file
/usr/share/man/man1/xzegrep.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzfgrep.1.gz because associated file
/usr/share/man/man1/xzfgrep.1.gz (of link group lzma) doesn't exist
Setting up patch (2.7.6-7) ...
Setting up libncursesw6:amd64 (6.2+20201114-2) ...
Setting up libsasl2-2:amd64 (2.1.27+dfsg-2.1) ...
Setting up inotify-tools (3.14-8.1) ...
Setting up g++ (4:10.2.1-1) ...
update-alternatives: using /usr/bin/g++ to provide /usr/bin/c++ (c++) in auto mode
Setting up libmpdec3:amd64 (2.5.1-1) ...
Setting up git-man (1:2.30.2-1) ...
Setting up libssh2-1:amd64 (1.9.0-2) ...
Setting up readline-common (8.1-1) ...
Setting up libgdbm6:amd64 (1.19-2) ...
Setting up libreadline8:amd64 (8.1-1) ...
Setting up libldap-2.4-2:amd64 (2.4.57+dfsg-3) ...
Setting up libcurl3-gnutls:amd64 (7.74.0-1.3+b1) ...
Setting up libgdbm-compat4:amd64 (1.19-2) ...
Setting up libperl5.32:amd64 (5.32.1-4+deb11u2) ...
Setting up libcurl4:amd64 (7.74.0-1.3+b1) ...
Setting up curl (7.74.0-1.3+b1) ...
Setting up libpython3.9-stdlib:amd64 (3.9.2-1) ...
Setting up libpython3-stdlib:amd64 (3.9.2-3) ...
Setting up perl (5.32.1-4+deb11u2) ...
Setting up libdpkg-perl (1.20.9) ...
Setting up python3.9 (3.9.2-1) ...
Setting up python3 (3.9.2-3) ...
running python rtupdate hooks for python3.9...
running python post-rtupdate hooks for python3.9...
Setting up dpkg-dev (1.20.9) ...
Setting up liberror-perl (0.17029-1) ...
Setting up git (1:2.30.2-1) ...
Setting up build-essential (12.9) ...
Setting up lsb-release (11.1.0) ...
Processing triggers for libc-bin (2.31-13+deb11u2) ...
Removing intermediate container 23bbc2cf7896
---> 6fdbdea75492
Step 3/21 : WORKDIR /app
---> Running in ca94109d1c1a
Removing intermediate container ca94109d1c1a
---> b4bb58586f2a
Step 4/21 : RUN rustup target add wasm32-unknown-unknown
---> Running in 3fa6c745e3ea
info: downloading component 'rust-std' for 'wasm32-unknown-unknown'
info: installing component 'rust-std' for 'wasm32-unknown-unknown'
Removing intermediate container 3fa6c745e3ea
---> 6415dbe2483d
Step 5/21 : RUN cargo install wasm-pack
---> Running in f23d7bf38644
Updating crates.io index
Downloading crates ...
Downloaded wasm-pack v0.10.1
Installing wasm-pack v0.10.1
Downloading crates ...
Downloaded either v1.6.1
Downloaded dtoa v0.4.8
Downloaded percent-encoding v1.0.1
Downloaded tokio-current-thread v0.1.7
Downloaded tokio-threadpool v0.1.18
Downloaded zip v0.5.13
Downloaded unicode-xid v0.2.2
Downloaded url v1.7.2
Downloaded unicode-width v0.1.9
Downloaded want v0.2.0
Downloaded object v0.26.2
Downloaded flate2 v1.0.22
Downloaded httparse v1.5.1
Downloaded futures v0.1.31
Downloaded is_executable v0.1.2
Downloaded native-tls v0.2.8
Downloaded parking_lot_core v0.6.2
Downloaded cfg-if v1.0.0
Downloaded scopeguard v1.1.0
Downloaded same-file v1.0.6
Downloaded rand_chacha v0.1.1
Downloaded num-integer v0.1.44
Downloaded rand_isaac v0.1.1
Downloaded slab v0.4.5
Downloaded smallvec v1.7.0
Downloaded serde_json v1.0.68
Downloaded mime v0.3.16
Downloaded syn v1.0.80
Downloaded hex v0.3.2
Downloaded net2 v0.2.37
Downloaded rand v0.3.23
Downloaded rand_xorshift v0.1.1
Downloaded terminal_size v0.1.17
Downloaded smallvec v0.6.14
Downloaded termcolor v1.1.2
Downloaded textwrap v0.11.0
Downloaded structopt-derive v0.4.16
Downloaded tinyvec_macros v0.1.0
Downloaded tar v0.4.37
Downloaded tokio-buf v0.1.1
Downloaded thiserror-impl v1.0.30
Downloaded synstructure v0.12.6
Downloaded tempfile v2.2.0
Downloaded serde_ignored v0.0.4
Downloaded string v0.2.1
Downloaded percent-encoding v2.1.0
Downloaded proc-macro-error-attr v1.0.4
Downloaded quote v1.0.10
Downloaded rand v0.5.6
Downloaded quick-error v1.2.3
Downloaded semver-parser v0.7.0
Downloaded ryu v1.0.5
Downloaded rustc_version v0.2.3
Downloaded reqwest v0.9.24
Downloaded tokio-timer v0.2.13
Downloaded tokio-tcp v0.1.4
Downloaded xattr v0.2.2
Downloaded walkdir v2.3.2
Downloaded unicode-segmentation v1.8.0
Downloaded uuid v0.7.4
Downloaded glob v0.2.11
Downloaded futures-cpupool v0.1.8
Downloaded human-panic v1.0.3
Downloaded http v0.1.21
Downloaded failure_derive v0.1.8
Downloaded bzip2-sys v0.1.11+1.0.8
Downloaded dirs v1.0.5
Downloaded regex-syntax v0.6.25
Downloaded try_from v0.3.2
Downloaded gimli v0.25.0
Downloaded libz-sys v1.1.3
Downloaded encoding_rs v0.8.28
Downloaded tokio v0.1.22
Downloaded url v2.2.2
Downloaded console v0.15.0
Downloaded crossbeam-utils v0.7.2
Downloaded crossbeam-epoch v0.8.2
Downloaded curl-sys v0.4.49+curl-7.79.1
Downloaded atty v0.2.14
Downloaded openssl-src v111.16.0+1.1.1l
Downloaded time v0.1.43
Downloaded which v2.0.1
Downloaded cargo_metadata v0.8.2
Downloaded bytes v0.4.12
Downloaded backtrace v0.3.61
Downloaded binary-install v0.0.2
Downloaded termios v0.3.3
Downloaded openssl v0.10.36
Downloaded parking_lot v0.11.2
Downloaded cookie v0.12.0
Downloaded console v0.6.2
Downloaded base64 v0.10.1
Downloaded crossbeam-deque v0.7.4
Downloaded toml v0.5.8
Downloaded tinyvec v1.5.0
Downloaded socket2 v0.4.2
Downloaded tokio-reactor v0.1.12
Downloaded tokio-io v0.1.13
Downloaded rand_jitter v0.1.4
Downloaded rustc-demangle v0.1.21
Downloaded rand_core v0.4.2
Downloaded parking_lot v0.9.0
Downloaded parking_lot v0.6.4
Downloaded os_type v2.3.0
Downloaded openssl-probe v0.1.4
Downloaded libc v0.2.104
Downloaded cookie_store v0.7.0
Downloaded addr2line v0.16.0
Downloaded strsim v0.8.0
Downloaded stable_deref_trait v1.2.0
Downloaded serde_derive v1.0.130
Downloaded serde v1.0.130
Downloaded serde_urlencoded v0.5.5
Downloaded semver v0.9.0
Downloaded scopeguard v0.3.3
Downloaded structopt v0.3.23
Downloaded rand_os v0.1.3
Downloaded siphasher v0.2.3
Downloaded rand_hc v0.1.0
Downloaded memoffset v0.5.6
Downloaded lock_api v0.3.4
Downloaded hyper-tls v0.3.2
Downloaded http-body v0.1.0
Downloaded rand_pcg v0.1.2
Downloaded rand_core v0.3.1
Downloaded rand v0.6.5
Downloaded publicsuffix v1.5.6
Downloaded owning_ref v0.4.1
Downloaded clicolors-control v0.2.0
Downloaded h2 v0.1.26
Downloaded bzip2 v0.4.3
Downloaded regex v1.5.4
Downloaded miniz_oxide v0.4.4
Downloaded mime_guess v2.0.3
Downloaded lock_api v0.4.5
Downloaded rand v0.4.6
Downloaded openssl-sys v0.9.67
Downloaded lock_api v0.1.5
Downloaded once_cell v1.8.0
Downloaded maybe-uninit v2.0.0
Downloaded lazy_static v0.2.11
Downloaded humantime v1.3.0
Downloaded clap v2.33.3
Downloaded iovec v0.1.4
Downloaded crc32fast v1.2.1
Downloaded cc v1.0.71
Downloaded matches v0.1.9
Downloaded chrono v0.4.19
Downloaded cfg-if v0.1.10
Downloaded autocfg v0.1.7
Downloaded parking_lot_core v0.3.1
Downloaded hyper v0.12.36
Downloaded idna v0.1.5
Downloaded dialoguer v0.3.0
Downloaded getrandom v0.2.3
Downloaded filetime v0.2.15
Downloaded env_logger v0.5.13
Downloaded failure v0.1.8
Downloaded byteorder v1.4.3
Downloaded aho-corasick v0.7.18
Downloaded uuid v0.8.2
Downloaded unicode-bidi v0.3.7
Downloaded bitflags v1.3.2
Downloaded ansi_term v0.11.0
Downloaded proc-macro2 v1.0.30
Downloaded unicode-normalization v0.1.19
Downloaded proc-macro-error v1.0.4
Downloaded pkg-config v0.3.20
Downloaded parking_lot_core v0.8.5
Downloaded unicase v2.6.0
Downloaded mio v0.6.23
Downloaded version_check v0.9.3
Downloaded vec_map v0.8.2
Downloaded try-lock v0.2.3
Downloaded toml v0.4.10
Downloaded tokio-sync v0.1.8
Downloaded tokio-executor v0.1.10
Downloaded num-traits v0.2.14
Downloaded memchr v2.4.1
Downloaded log v0.4.14
Downloaded idna v0.2.3
Downloaded thiserror v1.0.30
Downloaded indexmap v1.7.0
Downloaded hashbrown v0.11.2
Downloaded autocfg v1.0.1
Downloaded num_cpus v1.13.0
Downloaded lazy_static v1.4.0
Downloaded itoa v0.4.8
Downloaded instant v0.1.11
Downloaded heck v0.3.3
Downloaded form_urlencoded v1.0.1
Downloaded foreign-types-shared v0.1.1
Downloaded foreign-types v0.3.2
Downloaded fnv v1.0.7
Downloaded curl v0.4.39
Downloaded crossbeam-queue v0.2.3
Downloaded adler v1.0.2
Compiling libc v0.2.104
Compiling autocfg v1.0.1
Compiling proc-macro2 v1.0.30
Compiling unicode-xid v0.2.2
Compiling syn v1.0.80
Compiling serde_derive v1.0.130
Compiling serde v1.0.130
Compiling cfg-if v1.0.0
Compiling cc v1.0.71
Compiling pkg-config v0.3.20
Compiling semver-parser v0.7.0
Compiling cfg-if v0.1.10
Compiling lazy_static v1.4.0
Compiling futures v0.1.31
Compiling version_check v0.9.3
Compiling maybe-uninit v2.0.0
Compiling byteorder v1.4.3
Compiling log v0.4.14
Compiling memchr v2.4.1
Compiling rand_core v0.4.2
Compiling scopeguard v1.1.0
Compiling either v1.6.1
Compiling autocfg v0.1.7
Compiling tinyvec_macros v0.1.0
Compiling fnv v1.0.7
Compiling slab v0.4.5
Compiling adler v1.0.2
Compiling matches v0.1.9
Compiling itoa v0.4.8
Compiling unicode-bidi v0.3.7
Compiling gimli v0.25.0
Compiling failure_derive v0.1.8
Compiling rustc-demangle v0.1.21
Compiling once_cell v1.8.0
Compiling ryu v1.0.5
Compiling bitflags v1.3.2
Compiling regex-syntax v0.6.25
Compiling crc32fast v1.2.1
Compiling unicode-width v0.1.9
Compiling openssl-probe v0.1.4
Compiling httparse v1.5.1
Compiling hashbrown v0.11.2
Compiling openssl v0.10.36
Compiling percent-encoding v1.0.1
Compiling serde_json v1.0.68
Compiling percent-encoding v2.1.0
Compiling foreign-types-shared v0.1.1
Compiling native-tls v0.2.8
Compiling parking_lot_core v0.8.5
Compiling try-lock v0.2.3
Compiling unicode-segmentation v1.8.0
Compiling stable_deref_trait v1.2.0
Compiling encoding_rs v0.8.28
Compiling smallvec v1.7.0
Compiling curl v0.4.39
Compiling scopeguard v0.3.3
Compiling mime v0.3.16
Compiling quick-error v1.2.3
Compiling termcolor v1.1.2
Compiling vec_map v0.8.2
Compiling strsim v0.8.0
Compiling ansi_term v0.11.0
Compiling dtoa v0.4.8
Compiling lazy_static v0.2.11
Compiling is_executable v0.1.2
Compiling siphasher v0.2.3
Compiling hex v0.3.2
Compiling same-file v1.0.6
Compiling glob v0.2.11
Compiling crossbeam-utils v0.7.2
Compiling miniz_oxide v0.4.4
Compiling memoffset v0.5.6
Compiling crossbeam-epoch v0.8.2
Compiling indexmap v1.7.0
Compiling num-traits v0.2.14
Compiling num-integer v0.1.44
Compiling instant v0.1.11
Compiling openssl-src v111.16.0+1.1.1l
Compiling try_from v0.3.2
Compiling backtrace v0.3.61
Compiling libz-sys v1.1.3
Compiling curl-sys v0.4.49+curl-7.79.1
Compiling bzip2-sys v0.1.11+1.0.8
Compiling unicase v2.6.0
Compiling proc-macro-error-attr v1.0.4
Compiling proc-macro-error v1.0.4
Compiling base64 v0.10.1
Compiling rand_core v0.3.1
Compiling rand_jitter v0.1.4
Compiling lock_api v0.3.4
Compiling lock_api v0.4.5
Compiling tinyvec v1.5.0
Compiling tokio-sync v0.1.8
Compiling rand_chacha v0.1.1
Compiling rand_pcg v0.1.2
Compiling rand v0.6.5
Compiling addr2line v0.16.0
Compiling textwrap v0.11.0
Compiling form_urlencoded v1.0.1
Compiling foreign-types v0.3.2
Compiling heck v0.3.3
Compiling owning_ref v0.4.1
Compiling humantime v1.3.0
Compiling walkdir v2.3.2
Compiling openssl-sys v0.9.67
Compiling rand_hc v0.1.0
Compiling rand_isaac v0.1.1
Compiling rand_xorshift v0.1.1
Compiling unicode-normalization v0.1.19
Compiling lock_api v0.1.5
Compiling iovec v0.1.4
Compiling num_cpus v1.13.0
Compiling time v0.1.43
Compiling net2 v0.2.37
Compiling atty v0.2.14
Compiling rand_os v0.1.3
Compiling rand v0.4.6
Compiling xattr v0.2.2
Compiling filetime v0.2.15
Compiling rand v0.5.6
Compiling socket2 v0.4.2
Compiling getrandom v0.2.3
Compiling terminal_size v0.1.17
Compiling clicolors-control v0.2.0
Compiling termios v0.3.3
Compiling dirs v1.0.5
Compiling quote v1.0.10
Compiling smallvec v0.6.14
Compiling want v0.2.0
Compiling object v0.26.2
Compiling aho-corasick v0.7.18
Compiling idna v0.1.5
Compiling idna v0.2.3
Compiling bytes v0.4.12
Compiling futures-cpupool v0.1.8
Compiling mio v0.6.23
Compiling clap v2.33.3
Compiling env_logger v0.5.13
Compiling rand v0.3.23
Compiling tar v0.4.37
Compiling parking_lot v0.11.2
Compiling uuid v0.8.2
Compiling tokio-executor v0.1.10
Compiling crossbeam-queue v0.2.3
Compiling flate2 v1.0.22
Compiling mime_guess v2.0.3
Compiling regex v1.5.4
Compiling bzip2 v0.4.3
Compiling url v1.7.2
Compiling url v2.2.2
Compiling tokio-io v0.1.13
Compiling http v0.1.21
Compiling tokio-buf v0.1.1
Compiling string v0.2.1
Compiling tempfile v2.2.0
Compiling tokio-timer v0.2.13
Compiling tokio-current-thread v0.1.7
Compiling crossbeam-deque v0.7.4
Compiling chrono v0.4.19
Compiling synstructure v0.12.6
Compiling thiserror-impl v1.0.30
Compiling os_type v2.3.0
Compiling console v0.15.0
Compiling console v0.6.2
Compiling uuid v0.7.4
Compiling cookie v0.12.0
Compiling publicsuffix v1.5.6
Compiling h2 v0.1.26
Compiling http-body v0.1.0
Compiling tokio-threadpool v0.1.18
Compiling thiserror v1.0.30
Compiling structopt-derive v0.4.16
Compiling dialoguer v0.3.0
Compiling failure v0.1.8
Compiling zip v0.5.13
Compiling semver v0.9.0
Compiling serde_urlencoded v0.5.5
Compiling toml v0.5.8
Compiling serde_ignored v0.0.4
Compiling toml v0.4.10
Compiling structopt v0.3.23
Compiling which v2.0.1
Compiling rustc_version v0.2.3
Compiling cookie_store v0.7.0
Compiling cargo_metadata v0.8.2
Compiling human-panic v1.0.3
Compiling binary-install v0.0.2
Compiling parking_lot_core v0.6.2
Compiling parking_lot v0.9.0
Compiling hyper v0.12.36
Compiling parking_lot_core v0.3.1
Compiling parking_lot v0.6.4
Compiling tokio-reactor v0.1.12
Compiling tokio-tcp v0.1.4
Compiling tokio v0.1.22
Compiling hyper-tls v0.3.2
Compiling reqwest v0.9.24
Compiling wasm-pack v0.10.1
Finished release [optimized] target(s) in 7m 01s
Installing /usr/local/cargo/bin/wasm-pack
Installed package `wasm-pack v0.10.1` (executable `wasm-pack`)
Removing intermediate container f23d7bf38644
---> be3cec1f5484
Step 6/21 : RUN curl https://codeload.github.com/arctic-hen7/perseus/tar.gz/main | tar -xz --strip=2
perseus-main/examples/showcase
---> Running in 8eeee5b5f382
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100  328k    0  328k    0     0   946k      0 --:--:-- --:--:-- --:--:--  949k
Removing intermediate container 8eeee5b5f382
---> 9492df709f55
Step 7/21 : WORKDIR /app/showcase
---> Running in 5651bf455b75
Removing intermediate container 5651bf455b75
---> 14a939ffca5b
Step 8/21 : RUN cargo install perseus-cli --version 0.3.0-beta.12
---> Running in 23ce40c866e1
Downloading crates ...
Downloaded perseus-cli v0.3.0-beta.12
Updating crates.io index
Installing perseus-cli v0.3.0-beta.12
Downloading crates ...
Downloaded anyhow v1.0.44
Downloaded console v0.14.1
Downloaded include_dir_impl v0.6.2
Downloaded strsim v0.10.0
Downloaded textwrap v0.14.2
Downloaded indicatif v0.17.0-beta.1
Downloaded proc-macro-hack v0.5.19
Downloaded fs_extra v1.2.0
Downloaded fmterr v0.1.1
Downloaded clap v3.0.0-beta.4
Downloaded cargo_toml v0.9.2
Downloaded number_prefix v0.4.0
Downloaded glob v0.3.0
Downloaded include_dir v0.6.2
Downloaded os_str_bytes v3.1.0
Downloaded clap_derive v3.0.0-beta.4
Compiling proc-macro2 v1.0.30
Compiling unicode-xid v0.2.2
Compiling syn v1.0.80
Compiling libc v0.2.104
Compiling version_check v0.9.3
Compiling serde v1.0.130
Compiling autocfg v1.0.1
Compiling anyhow v1.0.44
Compiling proc-macro-hack v0.5.19
Compiling ryu v1.0.5
Compiling serde_derive v1.0.130
Compiling regex-syntax v0.6.25
Compiling unicode-segmentation v1.8.0
Compiling unicode-width v0.1.9
Compiling lazy_static v1.4.0
Compiling hashbrown v0.11.2
Compiling once_cell v1.8.0
Compiling serde_json v1.0.68
Compiling vec_map v0.8.2
Compiling itoa v0.4.8
Compiling glob v0.3.0
Compiling os_str_bytes v3.1.0
Compiling bitflags v1.3.2
Compiling termcolor v1.1.2
Compiling number_prefix v0.4.0
Compiling strsim v0.10.0
Compiling fmterr v0.1.1
Compiling fs_extra v1.2.0
Compiling proc-macro-error-attr v1.0.4
Compiling proc-macro-error v1.0.4
Compiling indexmap v1.7.0
Compiling heck v0.3.3
Compiling textwrap v0.14.2
Compiling regex v1.5.4
Compiling quote v1.0.10
Compiling terminal_size v0.1.17
Compiling atty v0.2.14
Compiling toml v0.5.8
Compiling console v0.15.0
Compiling console v0.14.1
Compiling indicatif v0.17.0-beta.1
Compiling include_dir_impl v0.6.2
Compiling thiserror-impl v1.0.30
Compiling include_dir v0.6.2
Compiling thiserror v1.0.30
Compiling clap_derive v3.0.0-beta.4
Compiling cargo_toml v0.9.2
Compiling clap v3.0.0-beta.4
Compiling perseus-cli v0.3.0-beta.12
Finished release [optimized] target(s) in 2m 25s
Installing /usr/local/cargo/bin/perseus
Installed package `perseus-cli v0.3.0-beta.12` (executable `perseus`)
Removing intermediate container 23ce40c866e1
---> b20c2971d228
Step 9/21 : RUN perseus clean
---> Running in 729f05412990
Removing intermediate container 729f05412990
---> 82d1c7909f0c
Step 10/21 : RUN sed -i s'/perseus = .*/perseus = "0.3.0-beta.12"/' ./Cargo.toml   && sed -i '/\[dependencies\]/a
wee_alloc = "0.4"' ./Cargo.toml
---> Running in cfb5e86244e2
Removing intermediate container cfb5e86244e2
---> 84df86e88d64
Step 11/21 : RUN echo ' \n[profile.release] \nopt-level = "s" \nlto = true ' >> ./Cargo.toml   && cat ./Cargo.toml
---> Running in 162cbd9880b9
[package]
name = "perseus-example-showcase"
version = "0.1.0"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
wee_alloc = "0.4"
# Perseus itself, which we (amazingly) need for a Perseus app
perseus = "0.3.0-beta.12"
# Sycamore, the library Perseus depends on for lower-leve reactivity primitivity
sycamore = { version = "0.6", features = ["ssr"] }
sycamore-router = "0.6"
# Serde, which lets you work with representations of data, like JSON
serde = { version = "1", features = ["derive"] }
serde_json = "1"

urlencoding = "2.1"

[dev-dependencies]
fantoccini = "0.17"
tokio = { version = "1", features = ["macros", "rt", "rt-multi-thread"] }

[profile.release] 
opt-level = "s" 
lto = true 
Removing intermediate container 162cbd9880b9
---> 34fab91d1538
Step 12/21 : RUN echo '#[global_allocator] \nstatic ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; \n' | cat -
./src/lib.rs > ./src/lib.rs.tmp   && mv ./src/lib.rs.tmp ./src/lib.rs   && cat ./src/lib.rs
---> Running in 502a63477a58
#[global_allocator] 
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; 

mod error_pages;
mod templates;

use perseus::define_app;

define_app! {
templates: [
crate::templates::index::get_template::<G>(),
crate::templates::about::get_template::<G>(),
crate::templates::new_post::get_template::<G>(),
crate::templates::post::get_template::<G>(),
crate::templates::ip::get_template::<G>(),
crate::templates::time_root::get_template::<G>(),
crate::templates::time::get_template::<G>(),
crate::templates::amalgamation::get_template::<G>()
],
error_pages: crate::error_pages::get_error_pages(),
locales: {
default: "en-US",
other: ["fr-FR", "es-ES"]
}
}
Removing intermediate container 502a63477a58
---> 6fde4084659e
Step 13/21 : RUN perseus prep
---> Running in 709b27c7293f
Removing intermediate container 709b27c7293f
---> 6d31d0befffa
Step 14/21 : RUN sed -i s'/perseus = .*/perseus = "0.3.0-beta.12"/' .perseus/Cargo.toml   && echo '
\n\n[profile.release] \nopt-level = "s" \nlto = true ' >> .perseus/Cargo.toml   && cat .perseus/Cargo.toml
---> Running in 9b2032f450ce
# This crate defines the user's app in terms that Wasm can understand, making development significantly simpler.
# IMPORTANT: spacing matters in this file for runtime replacements, do NOT change it!

[package]
name = "perseus-engine"
version = "0.3.0-beta.12"
edition = "2018"
default-run = "perseus-builder"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
# We alias here because the package name will change based on whatever's in the user's manifest
app = { package = "perseus-example-showcase", path = "../" }

perseus = "0.3.0-beta.12"
sycamore = { version = "0.6", features = ["ssr"] }
sycamore-router = "0.6"
web-sys = { version = "0.3", features = ["Event", "Headers", "Request", "RequestInit", "RequestMode", "Response",
"ReadableStream", "Window"] }
wasm-bindgen = { version = "0.2", features = ["serde-serialize"] }
wasm-bindgen-futures = "0.4"
serde = { version = "1", features = ["derive"] }
serde_json = "1" # Possibly don't need?
console_error_panic_hook = "0.1.6"
urlencoding = "2.1"
futures = "0.3"
fs_extra = "1"
lazy_static = "1"

# This section is needed for Wasm Pack (which we use instead of Trunk for flexibility)
[lib]
crate-type = ["cdylib", "rlib"]

# We define a binary for building, serving, and doing both
[[bin]]
name = "perseus-builder"
path = "src/bin/build.rs"

[[bin]]
name = "perseus-exporter"
path = "src/bin/export.rs"

[[bin]]
name = "perseus-tinker" # Yes, the noun is 'tinker', not 'tinkerer'
path = "src/bin/tinker.rs"

[workspace]
members = [ "server" ] 

[profile.release] 
opt-level = "s" 
lto = true 
Removing intermediate container 9b2032f450ce
---> 10ee1fe4b294
Step 15/21 : RUN perseus deploy
---> Running in 8b4baa11ff34
Blocking waiting for file lock on package cache
Updating crates.io index
Blocking waiting for file lock on package cache
Blocking waiting for file lock on package cache
Downloading crates ...
Downloaded rand_chacha v0.2.2
Downloaded resolv-conf v0.7.0
Downloaded actix-http v2.2.1
Downloaded rustc_version v0.3.3
Downloaded rand_core v0.5.1
Downloaded serde_urlencoded v0.7.0
Downloaded version_check v0.1.5
Downloaded tracing-futures v0.2.5
Downloaded time-macros-impl v0.1.2
Downloaded v_htmlescape v0.12.0
Downloaded actix-files v0.5.0
Downloaded actix-tls v2.0.0
Downloaded fxhash v0.2.1
Downloaded derive_more v0.99.16
Downloaded perseus-actix-web v0.3.0-beta.12
Downloaded ppv-lite86 v0.2.14
Downloaded socket2 v0.3.19
Downloaded generic-array v0.14.4
Downloaded pin-project-internal v1.0.8
Downloaded ucd-trie v0.1.3
Downloaded v_escape_derive v0.8.5
Downloaded v_escape v0.15.0
Downloaded trust-dns-resolver v0.19.7
Downloaded trust-dns-proto v0.19.7
Downloaded tokio-util v0.3.1
Downloaded actix-router v0.2.7
Downloaded actix-threadpool v0.3.3
Downloaded brotli2 v0.3.2
Downloaded bytestring v1.0.0
Downloaded digest v0.9.0
Downloaded tokio v0.2.25
Downloaded standback v0.2.17
Downloaded signal-hook-registry v1.4.0
Downloaded copyless v0.1.5
Downloaded cookie v0.14.4
Downloaded buf-min v0.4.0
Downloaded actix-utils v2.0.0
Downloaded brotli-sys v0.3.2
Downloaded actix-testing v1.0.1
Downloaded actix-service v1.0.6
Downloaded mio-uds v0.6.8
Downloaded match_cfg v0.1.0
Downloaded actix-server v1.0.4
Downloaded actix-macros v0.1.3
Downloaded enum-as-inner v0.3.3
Downloaded pest v2.1.3
Downloaded nom v4.2.3
Downloaded getrandom v0.1.16
Downloaded typenum v1.14.0
Downloaded time-macros v0.1.1
Downloaded threadpool v1.8.1
Downloaded pin-project v1.0.8
Downloaded linked-hash-map v0.5.4
Downloaded bytes v0.5.6
Downloaded base64 v0.13.0
Downloaded pin-project-lite v0.1.12
Downloaded pin-project-internal v0.4.28
Downloaded pin-project v0.4.28
Downloaded h2 v0.2.7
Downloaded lru-cache v0.1.2
Downloaded hostname v0.3.1
Downloaded const_fn v0.4.8
Downloaded language-tags v0.2.2
Downloaded awc v2.0.3
Downloaded cpufeatures v0.2.1
Downloaded convert_case v0.4.0
Downloaded actix-rt v1.1.1
Downloaded actix-connect v2.0.0
Downloaded time v0.2.27
Downloaded tracing-core v0.1.21
Downloaded tracing v0.1.29
Downloaded sha-1 v0.9.8
Downloaded semver-parser v0.10.2
Downloaded opaque-debug v0.3.0
Downloaded block-buffer v0.9.0
Downloaded semver v0.11.0
Downloaded rand v0.7.3
Downloaded actix-web-codegen v0.4.0
Downloaded actix-web v3.3.2
Downloaded actix-codec v0.3.0
Blocking waiting for file lock on package cache
Blocking waiting for file lock on build directory
Compiling libc v0.2.104
Compiling futures-core v0.3.17
Compiling futures-sink v0.3.17
Compiling futures-channel v0.3.17
Compiling bytes v0.5.6
Compiling pin-project-lite v0.1.12
Compiling pin-project-internal v0.4.28
Compiling parking_lot_core v0.8.5
Compiling scopeguard v1.1.0
Compiling getrandom v0.1.16
Compiling convert_case v0.4.0
Compiling tinyvec_macros v0.1.0
Compiling matches v0.1.9
Compiling percent-encoding v2.1.0
Compiling copyless v0.1.5
Compiling typenum v1.14.0
Compiling bitflags v1.3.2
Compiling unicode-bidi v0.3.7
Compiling ppv-lite86 v0.2.14
Compiling unicode-segmentation v1.8.0
Compiling either v1.6.1
Compiling const_fn v0.4.8
Compiling match_cfg v0.1.0
Compiling cc v1.0.71
Compiling crc32fast v1.2.1
Compiling quick-error v1.2.3
Compiling version_check v0.1.5
Compiling linked-hash-map v0.5.4
Compiling httparse v1.5.1
Compiling adler v1.0.2
Compiling encoding_rs v0.8.28
Compiling regex-syntax v0.6.25
Compiling mime v0.3.16
Compiling opaque-debug v0.3.0
Compiling cpufeatures v0.2.1
Compiling byteorder v1.4.3
Compiling language-tags v0.2.2
Compiling v_escape v0.15.0
Compiling base64 v0.13.0
Compiling v_htmlescape v0.12.0
Compiling standback v0.2.17
Compiling generic-array v0.14.4
Compiling unicase v2.6.0
Compiling time v0.2.27
Compiling cookie v0.14.4
Compiling instant v0.1.11
Compiling futures-util v0.3.17
Compiling miniz_oxide v0.4.4
Compiling log v0.4.14
Compiling tracing-core v0.1.21
Compiling buf-min v0.4.0
Compiling lock_api v0.4.5
Compiling bytestring v1.0.0
Compiling tinyvec v1.5.0
Compiling form_urlencoded v1.0.1
Compiling heck v0.3.3
Compiling nom v4.2.3
Compiling lru-cache v0.1.2
Compiling brotli-sys v0.3.2
Compiling fxhash v0.2.1
Compiling unicode-normalization v0.1.19
Compiling aho-corasick v0.7.18
Compiling tracing v0.1.29
Compiling iovec v0.1.4
Compiling net2 v0.2.37
Compiling signal-hook-registry v1.4.0
Compiling num_cpus v1.13.0
Compiling getrandom v0.2.3
Compiling hostname v0.3.1
Compiling time v0.1.43
Compiling socket2 v0.3.19
Compiling wee_alloc v0.4.5
Compiling idna v0.2.3
Compiling mime_guess v2.0.3
Compiling regex v1.5.4
Compiling flate2 v1.0.22
Compiling mio v0.6.23
Compiling threadpool v1.8.1
Compiling parking_lot v0.11.2
Compiling rand_core v0.5.1
Compiling ahash v0.7.6
Compiling resolv-conf v0.7.0
Compiling block-buffer v0.9.0
Compiling digest v0.9.0
Compiling url v2.2.2
Compiling derive_more v0.99.16
Compiling actix-macros v0.1.3
Compiling time-macros-impl v0.1.2
Compiling pin-project-internal v1.0.8
Compiling enum-as-inner v0.3.3
Compiling v_escape_derive v0.8.5
Compiling actix-web-codegen v0.4.0
Compiling chrono v0.4.19
Compiling brotli2 v0.3.2
Compiling mio-uds v0.6.8
Compiling rand_chacha v0.2.2
Compiling sha-1 v0.9.8
Compiling pin-project v0.4.28
Compiling time-macros v0.1.1
Compiling actix-threadpool v0.3.3
Compiling pin-project v1.0.8
Compiling tokio v0.2.25
Compiling rand v0.7.3
Compiling serde_urlencoded v0.7.0
Compiling actix-router v0.2.7
Compiling tracing-futures v0.2.5
Compiling futures-executor v0.3.17
Compiling actix-service v1.0.6
Compiling tokio-util v0.3.1
Compiling actix-rt v1.1.1
Compiling futures v0.3.17
Compiling actix-codec v0.3.0
Compiling h2 v0.2.7
Compiling trust-dns-proto v0.19.7
Compiling actix-utils v2.0.0
Compiling trust-dns-resolver v0.19.7
Compiling actix-server v1.0.4
Compiling actix-tls v2.0.0
Compiling sycamore-reactive v0.6.3
Compiling actix-connect v2.0.0
Compiling actix-testing v1.0.1
Compiling sycamore v0.6.3
Compiling actix-http v2.2.1
Compiling sycamore-router v0.6.3
Compiling perseus v0.3.0-beta.12
Compiling awc v2.0.3
Compiling perseus-example-showcase v0.1.0 (/app/showcase)
Compiling actix-web v3.3.2
Compiling perseus-engine v0.3.0-beta.12 (/app/showcase/.perseus)
Compiling actix-files v0.5.0
Compiling perseus-actix-web v0.3.0-beta.12
Compiling perseus-cli-server v0.3.0-beta.12 (/app/showcase/.perseus/server)
error: could not compile `perseus-cli-server`

Caused by:
process didn't exit successfully: `rustc --crate-name perseus_cli_server --edition=2018 server/src/main.rs
--error-format=json --json=diagnostic-rendered-ansi --crate-type bin --emit=dep-info,link -C opt-level=s -C lto -C
metadata=2d4629e7b7a27c7e -C extra-filename=-2d4629e7b7a27c7e --out-dir /app/showcase/.perseus/target/release/deps -L
dependency=/app/showcase/.perseus/target/release/deps --extern
actix_web=/app/showcase/.perseus/target/release/deps/libactix_web-0ddb54a59e6c1112.rlib --extern
futures=/app/showcase/.perseus/target/release/deps/libfutures-683fa289fe1a9ffe.rlib --extern
perseus=/app/showcase/.perseus/target/release/deps/libperseus-40a929013d2f399b.rlib --extern
perseus_actix_web=/app/showcase/.perseus/target/release/deps/libperseus_actix_web-1667433b778ade42.rlib --extern
perseus_engine=/app/showcase/.perseus/target/release/deps/libperseus_engine.rlib --extern
app=/app/showcase/.perseus/target/release/deps/libperseus_example_showcase-8019ac6d586cc266.rlib -L
native=/app/showcase/.perseus/target/release/build/brotli-sys-839c040303ac1e62/out` (signal: 9, SIGKILL: kill)
The command '/bin/sh -c perseus deploy' returned a non-zero code: 1

Expected behavior
Compilation of perseus-cli-server and any of the rest of the Perseus packages should not take over 512 MB RAM.

Screenshots
Screen shot right after all rustup processes died due to not enough memory and right before memory dropped back to the usual.
out-of-mem

Environment (please complete the following information):

  • Perseus Version: 0.3.0-beta.12]
  • Sycamore Version: 0.6
  • OS: debian 10
  • Browser: Not relevant
  • Browser Version: Not relevant

Additional context
Note that the Dockerfile as shown above is created using multiline cat command ending with EOL on it's own line, simply for posterity reasons. Creation of the Dockerfile doesn't need to be done this way.
Note all those subsequent cat commands stitching lines of text to Cargo.toml files and then outputing those files as a whole to the standard output.
Also note that the Dockerfile downloads the showcase example with curl from this repo automatically, which makes it standalone.

The Dockerfile used above

# get the base image
FROM rust:1.55-slim AS build

# install build dependencies
RUN apt update \
  && apt install -y --no-install-recommends lsb-release apt-transport-https \
  git inotify-tools ca-certificates build-essential make gcc curl

# prepare root project dir
WORKDIR /app

# download the target for wasm
RUN rustup target add wasm32-unknown-unknown

# install wasm-pack
RUN cargo install wasm-pack

# retrieve the src dir
RUN curl https://codeload.github.com/arctic-hen7/perseus/tar.gz/main \
  | tar -xz --strip=2 perseus-main/examples/showcase

# go to src dir
WORKDIR /app/showcase

# install perseus-cli
RUN cargo install perseus-cli --version 0.3.0-beta.12

# clean app
RUN perseus clean

# adjust app config
RUN sed -i s'/perseus = .*/perseus = "0.3.0-beta.12"/' ./Cargo.toml \
  && sed -i '/\[dependencies\]/a wee_alloc = "0.4"' ./Cargo.toml

# append app config
RUN echo ' \n\
[profile.release] \n\
opt-level = "s" \n\
lto = true ' >> ./Cargo.toml \
  && cat ./Cargo.toml

# prepend lib.rs
RUN echo '#[global_allocator] \n\
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; \n\
' | cat - ./src/lib.rs > ./src/lib.rs.tmp \
  && mv ./src/lib.rs.tmp ./src/lib.rs \
  && cat ./src/lib.rs

# prep and eject app
RUN perseus prep && perseus eject

# adjust and append perseus config <<== this step makes `perseus deploy` fail
RUN sed -i s'/perseus = .*/perseus = "0.3.0-beta.12"/' .perseus/Cargo.toml \
  && echo ' \n\n\
[profile.release] \n\
opt-level = "s" \n\
lto = true ' >> .perseus/Cargo.toml \
  && cat .perseus/Cargo.toml

# deploy app
RUN perseus deploy

# prepare deployment image
FROM debian:bullseye-slim

WORKDIR /app

COPY --from=build /app/showcase/pkg /app/

ENV PERSEUS_STANDALONE=true

ENV HOST=0.0.0.0

CMD ["./server"]

Locale redirection doesn't work with back button

Describe the bug
Right now, Perseus' locale detection system doesn't compensate for the fact that the user might press the back button in their browser after being redirected, in which case they'll be taken back to a completely blank page.

To Reproduce
Steps to reproduce the behavior:

  1. Enable i18n in any Perseus app with the locale parameter to the define_app! macro.
  2. Create an index page at /.
  3. Go to / in a browser, observe the locale redirection.
  4. Press the back button in your browser.
  5. See a blank screen.

Expected behavior
The user's back button should skip the interim locale detection page, and not display a blank page.

Screenshots
If applicable, add screenshots to help explain your problem.

Environment (please complete the following information):

  • Perseus Version: v0.3.0-beta.6
  • Sycamore Version: v0.6.1
  • OS: Ubuntu
  • Browser: Firefox
  • Browser Version: 93

Additional context
This is due to the use of .set_href() on window.location, when we should be using .replace(), which is documented on MDN here.

Path prefixing

Is your feature request related to a problem? Please describe.
Having built the new Perseus website ready for GitHub Pages, I've realized that it's actually currently impossible to deploy because Perseus assumes everything is at the root of the site, when in fact it may be under something else (like /perseus/... for a Pages site).

Describe the solution you'd like
Perseus should support a new optional parameter to define_app! called prefix that allows it to support being hosted underneath an existing URL. This would then be a simple matter of prepending this prefix to every call to .perseus/ that the app shell makes. This particularly affects exported sites.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

*Build paths* can't render root page consistently

Describe the bug
For a template docs, using the build paths strategy, we can't render the page /docs reliably. If the page name index is used, initial loads will work, but there doesn't seem to be a way to get subsequent loads to work properly yet.

To Reproduce
As above.

Expected behavior
Using the special name index, the page should render.

Environment (please complete the following information):

  • Perseus Version: v0.3.0-beta.1
  • Sycamore Version: v0.6.1

Additional context
Add any other context about the problem here.

Provide pre-built binaries for `perseus-cli`

Is your feature request related to a problem? Please describe.
Right now, we need to use cargo install perseus-cli which can take quite some time.

Describe the solution you'd like
Provide pre-built binaries for perseus-cli. Preferably, this should include linux, macOS and windows.

Additional context
This could be as simple as uploading artifacts to github releases or just building in CI and uploading artifacts. Eventually, it might be nice as well to have a npm package to make it easier to install.

Plugins

Is your feature request related to a problem? Please describe.
Right now, there's a large number of modifications to .perseus/ (which all require ejecting) that could be modularized.

Describe the solution you'd like
Perseus should have a plugins system with three types.

Type 1 plugins should provide functions that can be provided with extra information through define_app!. These functions will the be executed at various places in Perseus' engine. For example, a plugin could be created with this system that would add new routes to the inbuilt server, adding a GraphQL API with almost no configuration and no separate systems.

Type 2 plugins would be more powerful, being able to modify files arbitrarily in addition to providing type 1 capabilities. An example use for this would be appending size optimizations to .perseus/Cargo.toml.

Type 3 plugins would be the most powerful, as they would have their own entirely customizable .perseus/ directories. Further, they'd issue instructions to the CLI that would set new commands to be run for different Perseus commands. For example, they might instruct perseus serve to also spin up extra servers and a database in parallel. These would be read from a specially named file in .perseus/, and this would be done by stages. Then, an extra stage of completely custom executions could be added, which would preserve the CLI's own loaders and progress reporting system.

Describe alternatives you've considered
Manual ejection in all cases, but this is very tedious, and doesn't lend itself to a highly customizable and collaborative open-source ecosystem.

Additional context
Types 1 and 2 should be ready for v0.3.0 when it goes stable (meaning more beta releases), but type 3 will be reserved until after that. However, CLI instructions would be very useful for ejections already, and that should be included.

This issue will track general progress for all aspects of the plugins system, which will improve Perseus dramatically by providing the customizability of v0.1.x with the convenience of v0.2.x and the power of x0.3.x.

  • Add support for functional plugins
  • Add support for control plugins

Possible project renaming

This project was originally named Perseus because of the inspiration as an extension of Percy, but Sycamore turned out to be much better for the job, and 'Sycamoreus' didn't quite flow off the tongue, so I stuck with Perseus.

The beta version of this project is now ready, but before I publish it, I want to decide on a name for the project for now. This is a tracking issue for that.

Improve SEO and initial load

This is a big change to the existing initial render model, and one that I've wanted to make for a while.

Presently, on first load, the user is sent a generic HTML file, no matter what page they asked for, which includes the app shell, which then fetches the appropriate content. However, this means two round trips to load the first page, and then the app shell smoothly takes over from there. This also means that any crawlers that don't execute Wasm won't get anything except a blank screen, which is atrocious SEO.

The solution I propose is instead performing the app shell process on the server for the first time a user requests a page, then rendering the page as normal on the server and injecting it into that generic HTML file. That way, the user will always be served a complete page on first render, and then the app shell takes over.

I should clarify that this problem only applies to the first render. All further navigations are handled internally by the app shell, which makes things much smoother, almost like an SPA (but much better on the server).

This approach is also friendlier to a future exporting system, because this process could be performed for every page in an export stage, and thus a fully static site could be created, eliminating the need for the server for projects that don't need more complex request-time strategies.

New routing system

Perseus currently actually has two routing systems: one for the client (which is based on Sycamore), and an unrelated system on the server. However, the latter is all that's actually required.

The rationale behind this is that we already know everything about every page in the user's app except for the pages rendered with ISR, which are already handled by the old server-side algorithms. By using those, we'll be able to only perform routing on the client-side, and the server can act as an intermediary to static files (with request-time rendering strategies being applied there).

This will achieve much tighter integration between templates and routing, as it requires no specification of any paths like /post/<slug..> whatsoever (again, Perseus isn't an SPA, we already know almost everything about routing at build-time from the templates). This means that the system of template root paths is now far more important, as it defines exactly how routing will work. This will be documented closely for v0.2.0.

The only caveat of this approach that I see right now is no (current) support for dynamic parameters that come before the template root path, like i18n. As with that system, this would have to be implemented at a lower level outside the router. I'll think on possible ways to integrate this into the template-based routing systems.

Document styling pitfalls

Is your feature request related to a problem? Please describe.
Without documentation, full-page layouts (e.g. sticky footers and headers with grid layouts) are almost impossible to achieve in Perseus right now. The issue is Perseus' unique DOM hierarchy that's used to store content, which is currently completely undocumented, which leaves users completely in the dark as to why there's an empty <div> taking up 50% of a grid layout.

Describe the solution you'd like
Document styling pitfalls.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Feature-gate to reduce binary size

Is your feature request related to a problem? Please describe.
Even with aggressive size optimizations, Perseus' binary sizes are still very large. This is barely an issue on non-mobile systems with a solid internet connection, and Perseus is still one of the fastest frameworks in the world (Wasm or JS), but this can be improved. Total blocking time on mobile is the particular issue that needs to be addressed here.

Describe the solution you'd like
Perseus should aggressively feature-gate as much as possible, particularly for systems like i18n or plugins, which aren't needed in simpler sites. The bottom line is: if an app isn't using a feature, it shouldn't be in their binary. Right now, the situation is practically the opposite of that.

Describe alternatives you've considered
More aggressive size optimizations, though these come with dangers at runtime, particularly if we force all panics to abort, because this can be problematic in a web browser, especially if the user tries to catch panics from Perseus (which shouldn't occur, but anything is possible).

Additional context
This will require significant refactoring of a number of critical parts of Perseus, and the introduction of a number of new feature flags before v0.3.0 goes stable, as this will be a significant breaking change for apps using i18n, plugins, or really any complex features. I am also considering potentially even feature-gating rendering strategies, as that would provide a significant performance boost.

Also note that the core perseus crate contains logic for both the server and the client, so this would be the largest point of feature-gating.

New `script`s not executed on subsequent loads

Describe the bug
Any <script> tags specified through Perseus via .head() will not be loaded when the page changes. This results in unexpected behaviors like syntax highlighting scripts only working once the page is fully reloaded, and needs to be documented.

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior
The scripts should run, or this should be documented.

Environment (please complete the following information):

  • Perseus Version: v0.3.0-beta.6
  • Sycamore Version: v0.6.1
  • OS: Ubuntu
  • Browser: Firefox
  • Browser Version: 93

Additional context
This appears to be because Perseus uses .set_inner_html() to set the new <head>, and browsers will only load new scripts if they're added with .append_child() (web-sys functions). This is likely infeasible without considerable rendering changes or additional overhead, so this behavior should be copiously documented so we don't leave users in the dark on this, because it is extremely difficult to debug without knowledge of how Perseus handles subsequent loads.

PWAs

Is your feature request related to a problem? Please describe.
Progressive Web Apps (PWAs) have become incredibly powerful over the last few years, and can even work as viable Android apps now (see here). Right now, Wasm PWAs are practically nonexistent except for through Blazor, and Perseus has a significant opportunity to work with PWAs out of the box.

Describe the solution you'd like
This would likely be achieved with a plugin that adds PWA functionality. It would need to add the necessary manifest details, a few static assets, and a service worker. The last part is the hardest, because Wasm and service workers don't really work together yet, so this would probably have to be in JS for now. Nonetheless, it should be possible to cache the main Wasm binary and HTML/JSON resources without any changes to the Perseus server. However, E-Tag support on the server is long overdue, and this would improve cacheability and thus performance for non-exported apps.

Describe alternatives you've considered
A version of Perseus for apps, but that would require a ridiculous amount of work and would inevitably end up leading to fractured codebases.

Additional context
This is a tracking issue for PWAs in Perseus, and this should be a place for ideas on the topic as well as development updates. As I said, nearly all this work will occur in a plugin perseus-pwa, but there may also be some changes needed in the core.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.