From eb91f2bcabf690ea16763e343d9ea35ce41ec74f Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Wed, 1 Apr 2026 21:36:01 -0700 Subject: [PATCH] Cut over Fabro web app to a server-backed SPA Replace the old React Router SSR setup with a static SPA build served by fabro-server, move setup and GitHub auth handling into Rust, and update the default local web URL and stale Arc-era references to match the Fabro name. --- Cargo.lock | 182 ++ Cargo.toml | 3 + apps/fabro-web/app/api-client.test.ts | 60 - apps/fabro-web/app/api-client.ts | 80 - apps/fabro-web/app/api.ts | 58 + apps/fabro-web/app/entry.tsx | 17 + apps/fabro-web/app/layouts/app-shell.tsx | 163 +- apps/fabro-web/app/lib/config.server.ts | 112 - apps/fabro-web/app/lib/db.server.ts | 29 - apps/fabro-web/app/lib/demo-mode.server.ts | 15 - apps/fabro-web/app/lib/github.server.ts | 18 - apps/fabro-web/app/lib/merge-env.test.ts | 76 - apps/fabro-web/app/lib/merge-env.ts | 46 - .../app/lib/session-storage.server.ts | 78 - apps/fabro-web/app/lib/session.server.test.ts | 119 - apps/fabro-web/app/lib/session.server.ts | 70 - apps/fabro-web/app/root.tsx | 63 +- apps/fabro-web/app/router.tsx | 139 ++ apps/fabro-web/app/routes.ts | 46 - apps/fabro-web/app/routes/auth-callback.tsx | 66 - apps/fabro-web/app/routes/auth-login.tsx | 47 +- apps/fabro-web/app/routes/auth-logout.tsx | 15 - apps/fabro-web/app/routes/insights.tsx | 9 +- apps/fabro-web/app/routes/redirect-home.tsx | 25 +- apps/fabro-web/app/routes/retros.tsx | 9 +- apps/fabro-web/app/routes/run-detail.tsx | 11 +- apps/fabro-web/app/routes/run-files.tsx | 7 +- apps/fabro-web/app/routes/run-graph.tsx | 7 +- apps/fabro-web/app/routes/run-overview.tsx | 7 +- apps/fabro-web/app/routes/run-retro.tsx | 9 +- apps/fabro-web/app/routes/run-settings.tsx | 7 +- apps/fabro-web/app/routes/run-stages.tsx | 7 +- apps/fabro-web/app/routes/run-usage.tsx | 7 +- .../fabro-web/app/routes/run-verification.tsx | 7 +- apps/fabro-web/app/routes/runs.tsx | 17 +- apps/fabro-web/app/routes/session-detail.tsx | 11 +- apps/fabro-web/app/routes/settings.tsx | 9 +- apps/fabro-web/app/routes/setup-callback.tsx | 114 - apps/fabro-web/app/routes/setup-complete.tsx | 136 ++ apps/fabro-web/app/routes/setup.tsx | 59 +- apps/fabro-web/app/routes/start.tsx | 12 +- .../app/routes/verification-control.tsx | 9 +- .../app/routes/verification-controls.tsx | 9 +- .../app/routes/verification-criteria.tsx | 9 +- .../app/routes/verification-criterion.tsx | 9 +- apps/fabro-web/app/routes/workflow-detail.tsx | 9 +- apps/fabro-web/app/routes/workflow-runs.tsx | 7 +- apps/fabro-web/app/routes/workflows.tsx | 9 +- apps/fabro-web/dist/apple-touch-icon.png | Bin 0 -> 7843 bytes apps/fabro-web/dist/assets/app.css | 2 + apps/fabro-web/dist/assets/chunk-019jygp1.js | 3 + .../dist/assets/chunk-019jygp1.js.map | 10 + apps/fabro-web/dist/assets/chunk-02n7dnxd.js | 4 + .../dist/assets/chunk-02n7dnxd.js.map | 10 + apps/fabro-web/dist/assets/chunk-05s0gc93.js | 3 + .../dist/assets/chunk-05s0gc93.js.map | 10 + apps/fabro-web/dist/assets/chunk-06fm9b6d.js | 3 + .../dist/assets/chunk-06fm9b6d.js.map | 10 + apps/fabro-web/dist/assets/chunk-07en1qh1.js | 3 + .../dist/assets/chunk-07en1qh1.js.map | 10 + apps/fabro-web/dist/assets/chunk-09p5nycp.js | 3 + .../dist/assets/chunk-09p5nycp.js.map | 9 + apps/fabro-web/dist/assets/chunk-0dse7fse.js | 3 + .../dist/assets/chunk-0dse7fse.js.map | 9 + apps/fabro-web/dist/assets/chunk-0nc05j52.js | 3 + .../dist/assets/chunk-0nc05j52.js.map | 10 + apps/fabro-web/dist/assets/chunk-0pazjatd.js | 3 + .../dist/assets/chunk-0pazjatd.js.map | 10 + apps/fabro-web/dist/assets/chunk-0pkns8zn.js | 3 + .../dist/assets/chunk-0pkns8zn.js.map | 9 + apps/fabro-web/dist/assets/chunk-0tq24xt3.js | 3 + .../dist/assets/chunk-0tq24xt3.js.map | 10 + apps/fabro-web/dist/assets/chunk-11c3h1xt.js | 3 + .../dist/assets/chunk-11c3h1xt.js.map | 10 + apps/fabro-web/dist/assets/chunk-11vzjswv.js | 4 + .../dist/assets/chunk-11vzjswv.js.map | 10 + apps/fabro-web/dist/assets/chunk-17r63emm.js | 3 + .../dist/assets/chunk-17r63emm.js.map | 10 + apps/fabro-web/dist/assets/chunk-18pbarpx.js | 3 + .../dist/assets/chunk-18pbarpx.js.map | 9 + apps/fabro-web/dist/assets/chunk-1ezq7eg5.js | 3 + .../dist/assets/chunk-1ezq7eg5.js.map | 9 + apps/fabro-web/dist/assets/chunk-1jb7a4x7.js | 3 + .../dist/assets/chunk-1jb7a4x7.js.map | 10 + apps/fabro-web/dist/assets/chunk-1wjv325z.js | 3 + .../dist/assets/chunk-1wjv325z.js.map | 9 + apps/fabro-web/dist/assets/chunk-1xpescw2.js | 4 + .../dist/assets/chunk-1xpescw2.js.map | 10 + apps/fabro-web/dist/assets/chunk-1z6jks96.js | 3 + .../dist/assets/chunk-1z6jks96.js.map | 10 + apps/fabro-web/dist/assets/chunk-207mkg9t.js | 3 + .../dist/assets/chunk-207mkg9t.js.map | 10 + apps/fabro-web/dist/assets/chunk-2cjhppva.js | 3 + .../dist/assets/chunk-2cjhppva.js.map | 10 + apps/fabro-web/dist/assets/chunk-2d0xan0e.js | 3 + .../dist/assets/chunk-2d0xan0e.js.map | 10 + apps/fabro-web/dist/assets/chunk-2eh3eq47.js | 3 + .../dist/assets/chunk-2eh3eq47.js.map | 10 + apps/fabro-web/dist/assets/chunk-2ndh3q6f.js | 3 + .../dist/assets/chunk-2ndh3q6f.js.map | 10 + apps/fabro-web/dist/assets/chunk-2rnptd9f.js | 3 + .../dist/assets/chunk-2rnptd9f.js.map | 10 + apps/fabro-web/dist/assets/chunk-2t67c0zp.js | 3 + .../dist/assets/chunk-2t67c0zp.js.map | 10 + apps/fabro-web/dist/assets/chunk-2v5x7cyg.js | 3 + .../dist/assets/chunk-2v5x7cyg.js.map | 10 + apps/fabro-web/dist/assets/chunk-2xqt91k6.js | 3 + .../dist/assets/chunk-2xqt91k6.js.map | 10 + apps/fabro-web/dist/assets/chunk-2z02c7x4.js | 3 + .../dist/assets/chunk-2z02c7x4.js.map | 10 + apps/fabro-web/dist/assets/chunk-36rb0g8e.js | 4 + .../dist/assets/chunk-36rb0g8e.js.map | 10 + apps/fabro-web/dist/assets/chunk-3bn8ccxt.js | 3 + .../dist/assets/chunk-3bn8ccxt.js.map | 10 + apps/fabro-web/dist/assets/chunk-3g84zxfd.js | 3 + .../dist/assets/chunk-3g84zxfd.js.map | 10 + apps/fabro-web/dist/assets/chunk-3m9zvayn.js | 4 + .../dist/assets/chunk-3m9zvayn.js.map | 10 + apps/fabro-web/dist/assets/chunk-3my0wjn6.js | 3 + .../dist/assets/chunk-3my0wjn6.js.map | 10 + apps/fabro-web/dist/assets/chunk-3nbmjrwz.js | 3 + .../dist/assets/chunk-3nbmjrwz.js.map | 10 + apps/fabro-web/dist/assets/chunk-3qzmnqbk.js | 3 + .../dist/assets/chunk-3qzmnqbk.js.map | 9 + apps/fabro-web/dist/assets/chunk-3rchmqge.js | 4 + .../dist/assets/chunk-3rchmqge.js.map | 10 + apps/fabro-web/dist/assets/chunk-3tfe6c9b.js | 3 + .../dist/assets/chunk-3tfe6c9b.js.map | 11 + apps/fabro-web/dist/assets/chunk-457408mh.js | 3 + .../dist/assets/chunk-457408mh.js.map | 10 + apps/fabro-web/dist/assets/chunk-4833vrwm.js | 4 + .../dist/assets/chunk-4833vrwm.js.map | 11 + apps/fabro-web/dist/assets/chunk-48syp4by.js | 3 + .../dist/assets/chunk-48syp4by.js.map | 9 + apps/fabro-web/dist/assets/chunk-4bp68sr2.js | 3 + .../dist/assets/chunk-4bp68sr2.js.map | 10 + apps/fabro-web/dist/assets/chunk-4g4hkb7x.js | 3 + .../dist/assets/chunk-4g4hkb7x.js.map | 10 + apps/fabro-web/dist/assets/chunk-4h0ks3v3.js | 3 + .../dist/assets/chunk-4h0ks3v3.js.map | 10 + apps/fabro-web/dist/assets/chunk-4j8a65qz.js | 4 + .../dist/assets/chunk-4j8a65qz.js.map | 10 + apps/fabro-web/dist/assets/chunk-4v5fshv2.js | 4 + .../dist/assets/chunk-4v5fshv2.js.map | 10 + apps/fabro-web/dist/assets/chunk-50s79t1q.js | 3 + .../dist/assets/chunk-50s79t1q.js.map | 12 + apps/fabro-web/dist/assets/chunk-551b9h9v.js | 3 + .../dist/assets/chunk-551b9h9v.js.map | 10 + apps/fabro-web/dist/assets/chunk-56hr8ze6.js | 3 + .../dist/assets/chunk-56hr8ze6.js.map | 10 + apps/fabro-web/dist/assets/chunk-56ztj47e.js | 3 + .../dist/assets/chunk-56ztj47e.js.map | 10 + apps/fabro-web/dist/assets/chunk-5ass1cr8.js | 3 + .../dist/assets/chunk-5ass1cr8.js.map | 9 + apps/fabro-web/dist/assets/chunk-5bdrk519.js | 3 + .../dist/assets/chunk-5bdrk519.js.map | 10 + apps/fabro-web/dist/assets/chunk-5exp5fdx.js | 3 + .../dist/assets/chunk-5exp5fdx.js.map | 10 + apps/fabro-web/dist/assets/chunk-5gqhakby.js | 3 + .../dist/assets/chunk-5gqhakby.js.map | 10 + apps/fabro-web/dist/assets/chunk-5w2bs93r.js | 4 + .../dist/assets/chunk-5w2bs93r.js.map | 10 + apps/fabro-web/dist/assets/chunk-61ctvdht.js | 4 + .../dist/assets/chunk-61ctvdht.js.map | 10 + apps/fabro-web/dist/assets/chunk-63fds60w.js | 3 + .../dist/assets/chunk-63fds60w.js.map | 10 + apps/fabro-web/dist/assets/chunk-65xe94t7.js | 4 + .../dist/assets/chunk-65xe94t7.js.map | 10 + apps/fabro-web/dist/assets/chunk-6h2erjze.js | 3 + .../dist/assets/chunk-6h2erjze.js.map | 10 + apps/fabro-web/dist/assets/chunk-6jf76z88.js | 3 + .../dist/assets/chunk-6jf76z88.js.map | 10 + apps/fabro-web/dist/assets/chunk-6jy2cvk9.js | 3 + .../dist/assets/chunk-6jy2cvk9.js.map | 10 + apps/fabro-web/dist/assets/chunk-6kg96dj9.js | 3 + .../dist/assets/chunk-6kg96dj9.js.map | 9 + apps/fabro-web/dist/assets/chunk-6ma2q84r.js | 3 + .../dist/assets/chunk-6ma2q84r.js.map | 10 + apps/fabro-web/dist/assets/chunk-6p6xafmt.js | 3 + .../dist/assets/chunk-6p6xafmt.js.map | 9 + apps/fabro-web/dist/assets/chunk-6v4gpbdm.js | 3 + .../dist/assets/chunk-6v4gpbdm.js.map | 10 + apps/fabro-web/dist/assets/chunk-6x0cp4ft.js | 4 + .../dist/assets/chunk-6x0cp4ft.js.map | 10 + apps/fabro-web/dist/assets/chunk-6xtve84b.js | 3 + .../dist/assets/chunk-6xtve84b.js.map | 10 + apps/fabro-web/dist/assets/chunk-6z53j5sy.js | 3 + .../dist/assets/chunk-6z53j5sy.js.map | 10 + apps/fabro-web/dist/assets/chunk-72xk2942.js | 3 + .../dist/assets/chunk-72xk2942.js.map | 9 + apps/fabro-web/dist/assets/chunk-75fy5bdm.js | 3 + .../dist/assets/chunk-75fy5bdm.js.map | 10 + apps/fabro-web/dist/assets/chunk-78zbagrn.js | 3 + .../dist/assets/chunk-78zbagrn.js.map | 10 + apps/fabro-web/dist/assets/chunk-79ywv1g9.js | 3 + .../dist/assets/chunk-79ywv1g9.js.map | 10 + apps/fabro-web/dist/assets/chunk-7bh2jdae.js | 3 + .../dist/assets/chunk-7bh2jdae.js.map | 15 + apps/fabro-web/dist/assets/chunk-7ehscpxq.js | 3 + .../dist/assets/chunk-7ehscpxq.js.map | 10 + apps/fabro-web/dist/assets/chunk-7f3p0xqq.js | 3 + .../dist/assets/chunk-7f3p0xqq.js.map | 10 + apps/fabro-web/dist/assets/chunk-7r410k8q.js | 3 + .../dist/assets/chunk-7r410k8q.js.map | 10 + apps/fabro-web/dist/assets/chunk-7vrbbh2r.js | 3 + .../dist/assets/chunk-7vrbbh2r.js.map | 10 + apps/fabro-web/dist/assets/chunk-7wezvt4b.js | 3 + .../dist/assets/chunk-7wezvt4b.js.map | 10 + apps/fabro-web/dist/assets/chunk-87fva4et.js | 3 + .../dist/assets/chunk-87fva4et.js.map | 10 + apps/fabro-web/dist/assets/chunk-8c9bs2ba.js | 3 + .../dist/assets/chunk-8c9bs2ba.js.map | 10 + apps/fabro-web/dist/assets/chunk-8mdqjrtg.js | 3 + .../dist/assets/chunk-8mdqjrtg.js.map | 9 + apps/fabro-web/dist/assets/chunk-8mhds0wh.js | 4 + .../dist/assets/chunk-8mhds0wh.js.map | 10 + apps/fabro-web/dist/assets/chunk-8n4az5gq.js | 3 + .../dist/assets/chunk-8n4az5gq.js.map | 10 + apps/fabro-web/dist/assets/chunk-8peyj85j.js | 3 + .../dist/assets/chunk-8peyj85j.js.map | 10 + apps/fabro-web/dist/assets/chunk-8v6fnbbx.js | 4 + .../dist/assets/chunk-8v6fnbbx.js.map | 10 + apps/fabro-web/dist/assets/chunk-8xd3q6bh.js | 3 + .../dist/assets/chunk-8xd3q6bh.js.map | 9 + apps/fabro-web/dist/assets/chunk-8yfxtt5d.js | 3 + .../dist/assets/chunk-8yfxtt5d.js.map | 9 + apps/fabro-web/dist/assets/chunk-8z0qc74b.js | 3 + .../dist/assets/chunk-8z0qc74b.js.map | 9 + apps/fabro-web/dist/assets/chunk-8z6nk9f0.js | 3 + .../dist/assets/chunk-8z6nk9f0.js.map | 9 + apps/fabro-web/dist/assets/chunk-902g9fxx.js | 3 + .../dist/assets/chunk-902g9fxx.js.map | 10 + apps/fabro-web/dist/assets/chunk-90hhq6ga.js | 3 + .../dist/assets/chunk-90hhq6ga.js.map | 10 + apps/fabro-web/dist/assets/chunk-90qzx8bn.js | 13 + .../dist/assets/chunk-90qzx8bn.js.map | 10 + apps/fabro-web/dist/assets/chunk-9101h887.js | 4 + .../dist/assets/chunk-9101h887.js.map | 10 + apps/fabro-web/dist/assets/chunk-920h6h23.js | 3 + .../dist/assets/chunk-920h6h23.js.map | 10 + apps/fabro-web/dist/assets/chunk-96gcsfr8.js | 3 + .../dist/assets/chunk-96gcsfr8.js.map | 10 + apps/fabro-web/dist/assets/chunk-987ve6q9.js | 3 + .../dist/assets/chunk-987ve6q9.js.map | 9 + apps/fabro-web/dist/assets/chunk-98k5hywg.js | 3 + .../dist/assets/chunk-98k5hywg.js.map | 10 + apps/fabro-web/dist/assets/chunk-9c29ggzn.js | 3 + .../dist/assets/chunk-9c29ggzn.js.map | 9 + apps/fabro-web/dist/assets/chunk-9de8zztk.js | 3 + .../dist/assets/chunk-9de8zztk.js.map | 10 + apps/fabro-web/dist/assets/chunk-9e1qwkc0.js | 3 + .../dist/assets/chunk-9e1qwkc0.js.map | 10 + apps/fabro-web/dist/assets/chunk-9exrs9cr.js | 3 + .../dist/assets/chunk-9exrs9cr.js.map | 10 + apps/fabro-web/dist/assets/chunk-9mnmk4y2.js | 3 + .../dist/assets/chunk-9mnmk4y2.js.map | 10 + apps/fabro-web/dist/assets/chunk-9t57pdty.js | 4 + .../dist/assets/chunk-9t57pdty.js.map | 10 + apps/fabro-web/dist/assets/chunk-9t6ftmv1.js | 3 + .../dist/assets/chunk-9t6ftmv1.js.map | 9 + apps/fabro-web/dist/assets/chunk-9w9wrmb8.js | 3 + .../dist/assets/chunk-9w9wrmb8.js.map | 10 + apps/fabro-web/dist/assets/chunk-9ymzkh14.js | 3 + .../dist/assets/chunk-9ymzkh14.js.map | 10 + apps/fabro-web/dist/assets/chunk-9yxtr6b6.js | 3 + .../dist/assets/chunk-9yxtr6b6.js.map | 10 + apps/fabro-web/dist/assets/chunk-a24qcegx.js | 3 + .../dist/assets/chunk-a24qcegx.js.map | 10 + apps/fabro-web/dist/assets/chunk-a47kj248.js | 3 + .../dist/assets/chunk-a47kj248.js.map | 10 + apps/fabro-web/dist/assets/chunk-a9g0d87v.js | 3 + .../dist/assets/chunk-a9g0d87v.js.map | 10 + apps/fabro-web/dist/assets/chunk-ab4vmcds.js | 3 + .../dist/assets/chunk-ab4vmcds.js.map | 10 + apps/fabro-web/dist/assets/chunk-acsgr2m8.js | 3 + .../dist/assets/chunk-acsgr2m8.js.map | 10 + apps/fabro-web/dist/assets/chunk-ah94fbbe.js | 3 + .../dist/assets/chunk-ah94fbbe.js.map | 10 + apps/fabro-web/dist/assets/chunk-aj9s5f9k.js | 3 + .../dist/assets/chunk-aj9s5f9k.js.map | 10 + apps/fabro-web/dist/assets/chunk-akwfy8wn.js | 3 + .../dist/assets/chunk-akwfy8wn.js.map | 9 + apps/fabro-web/dist/assets/chunk-armxp3zn.js | 3 + .../dist/assets/chunk-armxp3zn.js.map | 10 + apps/fabro-web/dist/assets/chunk-avgm78q3.js | 3 + .../dist/assets/chunk-avgm78q3.js.map | 10 + apps/fabro-web/dist/assets/chunk-awbzcd9m.js | 3 + .../dist/assets/chunk-awbzcd9m.js.map | 10 + apps/fabro-web/dist/assets/chunk-b173jpp2.js | 3 + .../dist/assets/chunk-b173jpp2.js.map | 10 + apps/fabro-web/dist/assets/chunk-b1sy5kac.js | 3 + .../dist/assets/chunk-b1sy5kac.js.map | 10 + apps/fabro-web/dist/assets/chunk-ba2typew.js | 3 + .../dist/assets/chunk-ba2typew.js.map | 9 + apps/fabro-web/dist/assets/chunk-baw4wjvc.js | 3 + .../dist/assets/chunk-baw4wjvc.js.map | 10 + apps/fabro-web/dist/assets/chunk-bbjv3mcf.js | 3 + .../dist/assets/chunk-bbjv3mcf.js.map | 10 + apps/fabro-web/dist/assets/chunk-bcp47gas.js | 3 + .../dist/assets/chunk-bcp47gas.js.map | 9 + apps/fabro-web/dist/assets/chunk-be463r1s.js | 3 + .../dist/assets/chunk-be463r1s.js.map | 10 + apps/fabro-web/dist/assets/chunk-bj6rb0tc.js | 3 + .../dist/assets/chunk-bj6rb0tc.js.map | 9 + apps/fabro-web/dist/assets/chunk-btpdjb6n.js | 3 + .../dist/assets/chunk-btpdjb6n.js.map | 10 + apps/fabro-web/dist/assets/chunk-byx1xjhw.js | 4 + .../dist/assets/chunk-byx1xjhw.js.map | 10 + apps/fabro-web/dist/assets/chunk-c4pk66bt.js | 3 + .../dist/assets/chunk-c4pk66bt.js.map | 10 + apps/fabro-web/dist/assets/chunk-c5mjg0qf.js | 3 + .../dist/assets/chunk-c5mjg0qf.js.map | 10 + apps/fabro-web/dist/assets/chunk-c6gysrv0.js | 3 + .../dist/assets/chunk-c6gysrv0.js.map | 10 + apps/fabro-web/dist/assets/chunk-c6h3n9wp.js | 3 + .../dist/assets/chunk-c6h3n9wp.js.map | 10 + apps/fabro-web/dist/assets/chunk-c7dsx0a3.js | 3 + .../dist/assets/chunk-c7dsx0a3.js.map | 10 + apps/fabro-web/dist/assets/chunk-c9cv6qdm.js | 3 + .../dist/assets/chunk-c9cv6qdm.js.map | 10 + apps/fabro-web/dist/assets/chunk-cfknpdwe.js | 3 + .../dist/assets/chunk-cfknpdwe.js.map | 9 + apps/fabro-web/dist/assets/chunk-cfqkkm9n.js | 3 + .../dist/assets/chunk-cfqkkm9n.js.map | 10 + apps/fabro-web/dist/assets/chunk-chsjnf53.js | 3 + .../dist/assets/chunk-chsjnf53.js.map | 10 + apps/fabro-web/dist/assets/chunk-chywzwk3.js | 3 + .../dist/assets/chunk-chywzwk3.js.map | 10 + apps/fabro-web/dist/assets/chunk-csfvbt7s.js | 3 + .../dist/assets/chunk-csfvbt7s.js.map | 10 + apps/fabro-web/dist/assets/chunk-csnb7rks.js | 3 + .../dist/assets/chunk-csnb7rks.js.map | 10 + apps/fabro-web/dist/assets/chunk-cvdkeqcs.js | 3 + .../dist/assets/chunk-cvdkeqcs.js.map | 9 + apps/fabro-web/dist/assets/chunk-cws2ks36.js | 3 + .../dist/assets/chunk-cws2ks36.js.map | 10 + apps/fabro-web/dist/assets/chunk-cyr7gkwx.js | 3 + .../dist/assets/chunk-cyr7gkwx.js.map | 9 + apps/fabro-web/dist/assets/chunk-d0p7g53p.js | 3 + .../dist/assets/chunk-d0p7g53p.js.map | 10 + apps/fabro-web/dist/assets/chunk-d2pbkwzw.js | 3 + .../dist/assets/chunk-d2pbkwzw.js.map | 10 + apps/fabro-web/dist/assets/chunk-d2rnnscz.js | 3 + .../dist/assets/chunk-d2rnnscz.js.map | 10 + apps/fabro-web/dist/assets/chunk-d6xt8xhc.js | 4 + .../dist/assets/chunk-d6xt8xhc.js.map | 10 + apps/fabro-web/dist/assets/chunk-d8s6b9rv.js | 3 + .../dist/assets/chunk-d8s6b9rv.js.map | 9 + apps/fabro-web/dist/assets/chunk-d97t3fd8.js | 3 + .../dist/assets/chunk-d97t3fd8.js.map | 10 + apps/fabro-web/dist/assets/chunk-dd3vxa06.js | 3 + .../dist/assets/chunk-dd3vxa06.js.map | 10 + apps/fabro-web/dist/assets/chunk-dn6szkja.js | 3 + .../dist/assets/chunk-dn6szkja.js.map | 10 + apps/fabro-web/dist/assets/chunk-dn79dghe.js | 3 + .../dist/assets/chunk-dn79dghe.js.map | 10 + apps/fabro-web/dist/assets/chunk-dvna8fze.js | 3 + .../dist/assets/chunk-dvna8fze.js.map | 9 + apps/fabro-web/dist/assets/chunk-e1mesqtx.js | 4 + .../dist/assets/chunk-e1mesqtx.js.map | 10 + apps/fabro-web/dist/assets/chunk-eachxzks.js | 3 + .../dist/assets/chunk-eachxzks.js.map | 10 + apps/fabro-web/dist/assets/chunk-eaexpy25.js | 3 + .../dist/assets/chunk-eaexpy25.js.map | 10 + apps/fabro-web/dist/assets/chunk-ebraw617.js | 3 + .../dist/assets/chunk-ebraw617.js.map | 9 + apps/fabro-web/dist/assets/chunk-ee5ffmv7.js | 3 + .../dist/assets/chunk-ee5ffmv7.js.map | 10 + apps/fabro-web/dist/assets/chunk-eew9p379.js | 4 + .../dist/assets/chunk-eew9p379.js.map | 10 + apps/fabro-web/dist/assets/chunk-ef8450p6.js | 3 + .../dist/assets/chunk-ef8450p6.js.map | 10 + apps/fabro-web/dist/assets/chunk-em0zsd82.js | 3 + .../dist/assets/chunk-em0zsd82.js.map | 11 + apps/fabro-web/dist/assets/chunk-erxdztbx.js | 3 + .../dist/assets/chunk-erxdztbx.js.map | 10 + apps/fabro-web/dist/assets/chunk-esbzyb57.js | 3 + .../dist/assets/chunk-esbzyb57.js.map | 9 + apps/fabro-web/dist/assets/chunk-etxafnd6.js | 4 + .../dist/assets/chunk-etxafnd6.js.map | 10 + apps/fabro-web/dist/assets/chunk-f34ztz5g.js | 3 + .../dist/assets/chunk-f34ztz5g.js.map | 10 + apps/fabro-web/dist/assets/chunk-f3tyqdty.js | 3 + .../dist/assets/chunk-f3tyqdty.js.map | 10 + apps/fabro-web/dist/assets/chunk-fbwa2cfs.js | 3 + .../dist/assets/chunk-fbwa2cfs.js.map | 10 + apps/fabro-web/dist/assets/chunk-fjy7665g.js | 3 + .../dist/assets/chunk-fjy7665g.js.map | 10 + apps/fabro-web/dist/assets/chunk-fk8hckdh.js | 3 + .../dist/assets/chunk-fk8hckdh.js.map | 10 + apps/fabro-web/dist/assets/chunk-fkyxb6ae.js | 3 + .../dist/assets/chunk-fkyxb6ae.js.map | 10 + apps/fabro-web/dist/assets/chunk-fvbhfjt0.js | 3 + .../dist/assets/chunk-fvbhfjt0.js.map | 10 + apps/fabro-web/dist/assets/chunk-fwdy1tf5.js | 3 + .../dist/assets/chunk-fwdy1tf5.js.map | 10 + apps/fabro-web/dist/assets/chunk-fyxavgx7.js | 3 + .../dist/assets/chunk-fyxavgx7.js.map | 10 + apps/fabro-web/dist/assets/chunk-fzakadrz.js | 3 + .../dist/assets/chunk-fzakadrz.js.map | 10 + apps/fabro-web/dist/assets/chunk-g1zh8k8v.js | 3 + .../dist/assets/chunk-g1zh8k8v.js.map | 10 + apps/fabro-web/dist/assets/chunk-g3527668.js | 3 + .../dist/assets/chunk-g3527668.js.map | 9 + apps/fabro-web/dist/assets/chunk-ga01y5x5.js | 3 + .../dist/assets/chunk-ga01y5x5.js.map | 10 + apps/fabro-web/dist/assets/chunk-gf5c68z4.js | 3 + .../dist/assets/chunk-gf5c68z4.js.map | 10 + apps/fabro-web/dist/assets/chunk-ggpkgcfa.js | 3 + .../dist/assets/chunk-ggpkgcfa.js.map | 10 + apps/fabro-web/dist/assets/chunk-ghad1e1w.js | 3 + .../dist/assets/chunk-ghad1e1w.js.map | 10 + apps/fabro-web/dist/assets/chunk-gq03p1hd.js | 3 + .../dist/assets/chunk-gq03p1hd.js.map | 10 + apps/fabro-web/dist/assets/chunk-gwjyp4yd.js | 3 + .../dist/assets/chunk-gwjyp4yd.js.map | 10 + apps/fabro-web/dist/assets/chunk-h7f0amn3.js | 3 + .../dist/assets/chunk-h7f0amn3.js.map | 10 + apps/fabro-web/dist/assets/chunk-hd5d17zs.js | 3 + .../dist/assets/chunk-hd5d17zs.js.map | 10 + apps/fabro-web/dist/assets/chunk-hgjbbj4c.js | 3 + .../dist/assets/chunk-hgjbbj4c.js.map | 10 + apps/fabro-web/dist/assets/chunk-hhx1aavy.js | 3 + .../dist/assets/chunk-hhx1aavy.js.map | 10 + apps/fabro-web/dist/assets/chunk-hmhkhxp2.js | 3 + .../dist/assets/chunk-hmhkhxp2.js.map | 10 + apps/fabro-web/dist/assets/chunk-htahhx45.js | 3 + .../dist/assets/chunk-htahhx45.js.map | 10 + apps/fabro-web/dist/assets/chunk-j4nm0wg8.js | 3 + .../dist/assets/chunk-j4nm0wg8.js.map | 10 + apps/fabro-web/dist/assets/chunk-j75cbz63.js | 4 + .../dist/assets/chunk-j75cbz63.js.map | 10 + apps/fabro-web/dist/assets/chunk-jc1vw5fd.js | 3 + .../dist/assets/chunk-jc1vw5fd.js.map | 10 + apps/fabro-web/dist/assets/chunk-jc9zdc67.js | 3 + .../dist/assets/chunk-jc9zdc67.js.map | 10 + apps/fabro-web/dist/assets/chunk-jemhbdxk.js | 3 + .../dist/assets/chunk-jemhbdxk.js.map | 10 + apps/fabro-web/dist/assets/chunk-jfjf0jp7.js | 3 + .../dist/assets/chunk-jfjf0jp7.js.map | 10 + apps/fabro-web/dist/assets/chunk-jpbad646.js | 3 + .../dist/assets/chunk-jpbad646.js.map | 10 + apps/fabro-web/dist/assets/chunk-jtbngvde.js | 3 + .../dist/assets/chunk-jtbngvde.js.map | 10 + apps/fabro-web/dist/assets/chunk-jtffthwb.js | 3 + .../dist/assets/chunk-jtffthwb.js.map | 10 + apps/fabro-web/dist/assets/chunk-jvygjw94.js | 3 + .../dist/assets/chunk-jvygjw94.js.map | 10 + apps/fabro-web/dist/assets/chunk-k0s3svvy.js | 3 + .../dist/assets/chunk-k0s3svvy.js.map | 10 + apps/fabro-web/dist/assets/chunk-k28qfdjw.js | 4 + .../dist/assets/chunk-k28qfdjw.js.map | 10 + apps/fabro-web/dist/assets/chunk-k5jdp2xd.js | 3 + .../dist/assets/chunk-k5jdp2xd.js.map | 10 + apps/fabro-web/dist/assets/chunk-k7ynz5mz.js | 3 + .../dist/assets/chunk-k7ynz5mz.js.map | 10 + apps/fabro-web/dist/assets/chunk-k8m07by6.js | 3 + .../dist/assets/chunk-k8m07by6.js.map | 10 + apps/fabro-web/dist/assets/chunk-kaj4vs6d.js | 3 + .../dist/assets/chunk-kaj4vs6d.js.map | 10 + apps/fabro-web/dist/assets/chunk-kb76fs43.js | 3 + .../dist/assets/chunk-kb76fs43.js.map | 10 + apps/fabro-web/dist/assets/chunk-kdjgd0g9.js | 3 + .../dist/assets/chunk-kdjgd0g9.js.map | 10 + apps/fabro-web/dist/assets/chunk-ke79syqy.js | 3 + .../dist/assets/chunk-ke79syqy.js.map | 10 + apps/fabro-web/dist/assets/chunk-kgq5332v.js | 4 + .../dist/assets/chunk-kgq5332v.js.map | 10 + apps/fabro-web/dist/assets/chunk-km5w7dec.js | 4 + .../dist/assets/chunk-km5w7dec.js.map | 10 + apps/fabro-web/dist/assets/chunk-kqq1a30a.js | 3 + .../dist/assets/chunk-kqq1a30a.js.map | 10 + apps/fabro-web/dist/assets/chunk-kv06br00.js | 4 + .../dist/assets/chunk-kv06br00.js.map | 10 + apps/fabro-web/dist/assets/chunk-kxn7andw.js | 3 + .../dist/assets/chunk-kxn7andw.js.map | 10 + apps/fabro-web/dist/assets/chunk-kxzd3ypz.js | 3 + .../dist/assets/chunk-kxzd3ypz.js.map | 10 + apps/fabro-web/dist/assets/chunk-ky56e8mk.js | 3 + .../dist/assets/chunk-ky56e8mk.js.map | 9 + apps/fabro-web/dist/assets/chunk-m2sbqbtm.js | 3 + .../dist/assets/chunk-m2sbqbtm.js.map | 10 + apps/fabro-web/dist/assets/chunk-m76mdd1n.js | 3 + .../dist/assets/chunk-m76mdd1n.js.map | 10 + apps/fabro-web/dist/assets/chunk-m8j14bjr.js | 3 + .../dist/assets/chunk-m8j14bjr.js.map | 10 + apps/fabro-web/dist/assets/chunk-mbdgfkdv.js | 3 + .../dist/assets/chunk-mbdgfkdv.js.map | 10 + apps/fabro-web/dist/assets/chunk-mbpm8tp5.js | 3 + .../dist/assets/chunk-mbpm8tp5.js.map | 10 + apps/fabro-web/dist/assets/chunk-mjacvcxt.js | 3 + .../dist/assets/chunk-mjacvcxt.js.map | 10 + apps/fabro-web/dist/assets/chunk-mkrka56j.js | 3 + .../dist/assets/chunk-mkrka56j.js.map | 10 + apps/fabro-web/dist/assets/chunk-mmwq9sqb.js | 3 + .../dist/assets/chunk-mmwq9sqb.js.map | 10 + apps/fabro-web/dist/assets/chunk-mshhqkhw.js | 4 + .../dist/assets/chunk-mshhqkhw.js.map | 10 + apps/fabro-web/dist/assets/chunk-my086dk6.js | 3 + .../dist/assets/chunk-my086dk6.js.map | 9 + apps/fabro-web/dist/assets/chunk-n1k68xa8.js | 4 + .../dist/assets/chunk-n1k68xa8.js.map | 10 + apps/fabro-web/dist/assets/chunk-n2yspqr0.js | 3 + .../dist/assets/chunk-n2yspqr0.js.map | 10 + apps/fabro-web/dist/assets/chunk-n3vkfzf2.js | 3 + .../dist/assets/chunk-n3vkfzf2.js.map | 10 + apps/fabro-web/dist/assets/chunk-n46mdkj2.js | 3 + .../dist/assets/chunk-n46mdkj2.js.map | 10 + apps/fabro-web/dist/assets/chunk-nb7r3qa9.js | 3 + .../dist/assets/chunk-nb7r3qa9.js.map | 9 + apps/fabro-web/dist/assets/chunk-ndd1s58m.js | 3 + .../dist/assets/chunk-ndd1s58m.js.map | 10 + apps/fabro-web/dist/assets/chunk-ndrfe9w3.js | 3 + .../dist/assets/chunk-ndrfe9w3.js.map | 10 + apps/fabro-web/dist/assets/chunk-nk5ky6zd.js | 3 + .../dist/assets/chunk-nk5ky6zd.js.map | 10 + apps/fabro-web/dist/assets/chunk-npf8ns55.js | 3 + .../dist/assets/chunk-npf8ns55.js.map | 10 + apps/fabro-web/dist/assets/chunk-nr8rrtg9.js | 3 + .../dist/assets/chunk-nr8rrtg9.js.map | 10 + apps/fabro-web/dist/assets/chunk-nsg7r6pt.js | 3 + .../dist/assets/chunk-nsg7r6pt.js.map | 10 + apps/fabro-web/dist/assets/chunk-p01md5kb.js | 3 + .../dist/assets/chunk-p01md5kb.js.map | 10 + apps/fabro-web/dist/assets/chunk-p14884cp.js | 3 + .../dist/assets/chunk-p14884cp.js.map | 10 + apps/fabro-web/dist/assets/chunk-p59yzxc1.js | 3 + .../dist/assets/chunk-p59yzxc1.js.map | 10 + apps/fabro-web/dist/assets/chunk-p5b70qpc.js | 3 + .../dist/assets/chunk-p5b70qpc.js.map | 10 + apps/fabro-web/dist/assets/chunk-p7fc4tsd.js | 3 + .../dist/assets/chunk-p7fc4tsd.js.map | 10 + apps/fabro-web/dist/assets/chunk-pd6abytg.js | 3 + .../dist/assets/chunk-pd6abytg.js.map | 10 + apps/fabro-web/dist/assets/chunk-pectm3zk.js | 4 + .../dist/assets/chunk-pectm3zk.js.map | 10 + apps/fabro-web/dist/assets/chunk-phcaqr54.js | 3 + .../dist/assets/chunk-phcaqr54.js.map | 10 + apps/fabro-web/dist/assets/chunk-pmaq1598.js | 3 + .../dist/assets/chunk-pmaq1598.js.map | 10 + apps/fabro-web/dist/assets/chunk-pmthkscp.js | 4 + .../dist/assets/chunk-pmthkscp.js.map | 10 + apps/fabro-web/dist/assets/chunk-pn8pe904.js | 3 + .../dist/assets/chunk-pn8pe904.js.map | 10 + apps/fabro-web/dist/assets/chunk-pncyzxg8.js | 3 + .../dist/assets/chunk-pncyzxg8.js.map | 10 + apps/fabro-web/dist/assets/chunk-psq81tp2.js | 3 + .../dist/assets/chunk-psq81tp2.js.map | 10 + apps/fabro-web/dist/assets/chunk-ptvkbn7g.js | 3 + .../dist/assets/chunk-ptvkbn7g.js.map | 10 + apps/fabro-web/dist/assets/chunk-q07bg6gn.js | 4 + .../dist/assets/chunk-q07bg6gn.js.map | 9 + apps/fabro-web/dist/assets/chunk-q0vrryxz.js | 4 + .../dist/assets/chunk-q0vrryxz.js.map | 10 + apps/fabro-web/dist/assets/chunk-q2qv5qr4.js | 3 + .../dist/assets/chunk-q2qv5qr4.js.map | 10 + apps/fabro-web/dist/assets/chunk-q39a3r2f.js | 3 + .../dist/assets/chunk-q39a3r2f.js.map | 9 + apps/fabro-web/dist/assets/chunk-q3g4jpcq.js | 3 + .../dist/assets/chunk-q3g4jpcq.js.map | 9 + apps/fabro-web/dist/assets/chunk-q65fbn3b.js | 3 + .../dist/assets/chunk-q65fbn3b.js.map | 10 + apps/fabro-web/dist/assets/chunk-q6h0xf66.js | 3 + .../dist/assets/chunk-q6h0xf66.js.map | 10 + apps/fabro-web/dist/assets/chunk-q6ham3g2.js | 3 + .../dist/assets/chunk-q6ham3g2.js.map | 10 + apps/fabro-web/dist/assets/chunk-qaxg1f9d.js | 3 + .../dist/assets/chunk-qaxg1f9d.js.map | 10 + apps/fabro-web/dist/assets/chunk-qb2gzhv8.js | 3 + .../dist/assets/chunk-qb2gzhv8.js.map | 10 + apps/fabro-web/dist/assets/chunk-qde7gss3.js | 3 + .../dist/assets/chunk-qde7gss3.js.map | 9 + apps/fabro-web/dist/assets/chunk-qfxxt7qs.js | 3 + .../dist/assets/chunk-qfxxt7qs.js.map | 10 + apps/fabro-web/dist/assets/chunk-qnfzgtdb.js | 3 + .../dist/assets/chunk-qnfzgtdb.js.map | 10 + apps/fabro-web/dist/assets/chunk-qpmc3wjq.js | 3 + .../dist/assets/chunk-qpmc3wjq.js.map | 10 + apps/fabro-web/dist/assets/chunk-qrfhzdgw.js | 3 + .../dist/assets/chunk-qrfhzdgw.js.map | 10 + apps/fabro-web/dist/assets/chunk-qs7etptz.js | 3 + .../dist/assets/chunk-qs7etptz.js.map | 10 + apps/fabro-web/dist/assets/chunk-qw1h4rez.js | 3 + .../dist/assets/chunk-qw1h4rez.js.map | 10 + apps/fabro-web/dist/assets/chunk-qz4nw45n.js | 3 + .../dist/assets/chunk-qz4nw45n.js.map | 10 + apps/fabro-web/dist/assets/chunk-r2w3cygs.js | 4 + .../dist/assets/chunk-r2w3cygs.js.map | 10 + apps/fabro-web/dist/assets/chunk-r5kt8fba.js | 3 + .../dist/assets/chunk-r5kt8fba.js.map | 10 + apps/fabro-web/dist/assets/chunk-r75z3brq.js | 4 + .../dist/assets/chunk-r75z3brq.js.map | 10 + apps/fabro-web/dist/assets/chunk-r9hd67p9.js | 3 + .../dist/assets/chunk-r9hd67p9.js.map | 10 + apps/fabro-web/dist/assets/chunk-rapg8dhf.js | 4 + .../dist/assets/chunk-rapg8dhf.js.map | 10 + apps/fabro-web/dist/assets/chunk-rbfg5snd.js | 3 + .../dist/assets/chunk-rbfg5snd.js.map | 10 + apps/fabro-web/dist/assets/chunk-rcqepjsk.js | 3 + .../dist/assets/chunk-rcqepjsk.js.map | 10 + apps/fabro-web/dist/assets/chunk-rgez69q8.js | 3 + .../dist/assets/chunk-rgez69q8.js.map | 10 + apps/fabro-web/dist/assets/chunk-rh0e3ajf.js | 3 + .../dist/assets/chunk-rh0e3ajf.js.map | 10 + apps/fabro-web/dist/assets/chunk-rsph5pvm.js | 4 + .../dist/assets/chunk-rsph5pvm.js.map | 14 + apps/fabro-web/dist/assets/chunk-sadshphz.js | 4 + .../dist/assets/chunk-sadshphz.js.map | 10 + apps/fabro-web/dist/assets/chunk-sbh2grtg.js | 3 + .../dist/assets/chunk-sbh2grtg.js.map | 10 + apps/fabro-web/dist/assets/chunk-sbn8gekr.js | 3 + .../dist/assets/chunk-sbn8gekr.js.map | 9 + apps/fabro-web/dist/assets/chunk-smdcgjwd.js | 3 + .../dist/assets/chunk-smdcgjwd.js.map | 9 + apps/fabro-web/dist/assets/chunk-svjx2h8c.js | 4 + .../dist/assets/chunk-svjx2h8c.js.map | 10 + apps/fabro-web/dist/assets/chunk-svns442s.js | 3 + .../dist/assets/chunk-svns442s.js.map | 9 + apps/fabro-web/dist/assets/chunk-sxph8y9z.js | 3 + .../dist/assets/chunk-sxph8y9z.js.map | 10 + apps/fabro-web/dist/assets/chunk-t0m0y0zg.js | 3 + .../dist/assets/chunk-t0m0y0zg.js.map | 10 + apps/fabro-web/dist/assets/chunk-t2049s6y.js | 4 + .../dist/assets/chunk-t2049s6y.js.map | 10 + apps/fabro-web/dist/assets/chunk-t2f2nqdv.js | 3 + .../dist/assets/chunk-t2f2nqdv.js.map | 10 + apps/fabro-web/dist/assets/chunk-t5bjexfm.js | 4 + .../dist/assets/chunk-t5bjexfm.js.map | 10 + apps/fabro-web/dist/assets/chunk-t8zbyt7b.js | 3 + .../dist/assets/chunk-t8zbyt7b.js.map | 10 + apps/fabro-web/dist/assets/chunk-t93s8qrg.js | 3 + .../dist/assets/chunk-t93s8qrg.js.map | 10 + apps/fabro-web/dist/assets/chunk-t9d9v6n6.js | 3 + .../dist/assets/chunk-t9d9v6n6.js.map | 14 + apps/fabro-web/dist/assets/chunk-tc62g36x.js | 3 + .../dist/assets/chunk-tc62g36x.js.map | 10 + apps/fabro-web/dist/assets/chunk-tfvpfprw.js | 3 + .../dist/assets/chunk-tfvpfprw.js.map | 10 + apps/fabro-web/dist/assets/chunk-tjs01n4p.js | 3 + .../dist/assets/chunk-tjs01n4p.js.map | 10 + apps/fabro-web/dist/assets/chunk-tjzzpcck.js | 3 + .../dist/assets/chunk-tjzzpcck.js.map | 10 + apps/fabro-web/dist/assets/chunk-tk854k1k.js | 3 + .../dist/assets/chunk-tk854k1k.js.map | 10 + apps/fabro-web/dist/assets/chunk-tkb7chq0.js | 3 + .../dist/assets/chunk-tkb7chq0.js.map | 10 + apps/fabro-web/dist/assets/chunk-tqzz87j8.js | 3 + .../dist/assets/chunk-tqzz87j8.js.map | 10 + apps/fabro-web/dist/assets/chunk-trdkyqje.js | 3 + .../dist/assets/chunk-trdkyqje.js.map | 10 + apps/fabro-web/dist/assets/chunk-trhe0hqm.js | 3 + .../dist/assets/chunk-trhe0hqm.js.map | 10 + apps/fabro-web/dist/assets/chunk-ttnh8s6j.js | 3 + .../dist/assets/chunk-ttnh8s6j.js.map | 10 + apps/fabro-web/dist/assets/chunk-tv34b2xa.js | 3 + .../dist/assets/chunk-tv34b2xa.js.map | 10 + apps/fabro-web/dist/assets/chunk-tx0vzgf6.js | 3 + .../dist/assets/chunk-tx0vzgf6.js.map | 10 + apps/fabro-web/dist/assets/chunk-txw8s4xq.js | 3 + .../dist/assets/chunk-txw8s4xq.js.map | 10 + apps/fabro-web/dist/assets/chunk-v2bk3hqh.js | 3 + .../dist/assets/chunk-v2bk3hqh.js.map | 10 + apps/fabro-web/dist/assets/chunk-v61ks9f7.js | 4 + .../dist/assets/chunk-v61ks9f7.js.map | 10 + apps/fabro-web/dist/assets/chunk-v9ftnkm2.js | 3 + .../dist/assets/chunk-v9ftnkm2.js.map | 10 + apps/fabro-web/dist/assets/chunk-vb08mr9g.js | 3 + .../dist/assets/chunk-vb08mr9g.js.map | 9 + apps/fabro-web/dist/assets/chunk-vb7qqcne.js | 3 + .../dist/assets/chunk-vb7qqcne.js.map | 10 + apps/fabro-web/dist/assets/chunk-vc7h2mcw.js | 3 + .../dist/assets/chunk-vc7h2mcw.js.map | 10 + apps/fabro-web/dist/assets/chunk-vjx23yxz.js | 3 + .../dist/assets/chunk-vjx23yxz.js.map | 10 + apps/fabro-web/dist/assets/chunk-vkqn43a3.js | 3 + .../dist/assets/chunk-vkqn43a3.js.map | 10 + apps/fabro-web/dist/assets/chunk-vnxhvf32.js | 3 + .../dist/assets/chunk-vnxhvf32.js.map | 10 + apps/fabro-web/dist/assets/chunk-vyvre5f7.js | 3 + .../dist/assets/chunk-vyvre5f7.js.map | 10 + apps/fabro-web/dist/assets/chunk-vz6zae36.js | 4 + .../dist/assets/chunk-vz6zae36.js.map | 10 + apps/fabro-web/dist/assets/chunk-vznmwsj2.js | 3 + .../dist/assets/chunk-vznmwsj2.js.map | 10 + apps/fabro-web/dist/assets/chunk-w0p583k6.js | 3 + .../dist/assets/chunk-w0p583k6.js.map | 10 + apps/fabro-web/dist/assets/chunk-w24seer2.js | 3 + .../dist/assets/chunk-w24seer2.js.map | 10 + apps/fabro-web/dist/assets/chunk-w4txx8sc.js | 3 + .../dist/assets/chunk-w4txx8sc.js.map | 10 + apps/fabro-web/dist/assets/chunk-wk8q2ejk.js | 3 + .../dist/assets/chunk-wk8q2ejk.js.map | 10 + apps/fabro-web/dist/assets/chunk-wq7vfert.js | 3 + .../dist/assets/chunk-wq7vfert.js.map | 9 + apps/fabro-web/dist/assets/chunk-wv916p92.js | 4 + .../dist/assets/chunk-wv916p92.js.map | 10 + apps/fabro-web/dist/assets/chunk-wx1qv58v.js | 3 + .../dist/assets/chunk-wx1qv58v.js.map | 10 + apps/fabro-web/dist/assets/chunk-wyhemkn7.js | 3 + .../dist/assets/chunk-wyhemkn7.js.map | 10 + apps/fabro-web/dist/assets/chunk-wzb9zsp9.js | 4 + .../dist/assets/chunk-wzb9zsp9.js.map | 10 + apps/fabro-web/dist/assets/chunk-x4p58zc4.js | 3 + .../dist/assets/chunk-x4p58zc4.js.map | 10 + apps/fabro-web/dist/assets/chunk-xbsshqee.js | 3 + .../dist/assets/chunk-xbsshqee.js.map | 9 + apps/fabro-web/dist/assets/chunk-xcxrzfy1.js | 3 + .../dist/assets/chunk-xcxrzfy1.js.map | 10 + apps/fabro-web/dist/assets/chunk-xr25x186.js | 3 + .../dist/assets/chunk-xr25x186.js.map | 10 + apps/fabro-web/dist/assets/chunk-xsg5yrft.js | 3 + .../dist/assets/chunk-xsg5yrft.js.map | 10 + apps/fabro-web/dist/assets/chunk-xsjq18b3.js | 3 + .../dist/assets/chunk-xsjq18b3.js.map | 10 + apps/fabro-web/dist/assets/chunk-xvjs9feb.js | 3 + .../dist/assets/chunk-xvjs9feb.js.map | 10 + apps/fabro-web/dist/assets/chunk-yc4p6sd7.js | 3 + .../dist/assets/chunk-yc4p6sd7.js.map | 10 + apps/fabro-web/dist/assets/chunk-yj17k4xm.js | 3 + .../dist/assets/chunk-yj17k4xm.js.map | 10 + apps/fabro-web/dist/assets/chunk-ym5wbpcw.js | 3 + .../dist/assets/chunk-ym5wbpcw.js.map | 9 + apps/fabro-web/dist/assets/chunk-yme4dsd5.js | 3 + .../dist/assets/chunk-yme4dsd5.js.map | 10 + apps/fabro-web/dist/assets/chunk-ysp46zk7.js | 3 + .../dist/assets/chunk-ysp46zk7.js.map | 10 + apps/fabro-web/dist/assets/chunk-yxgc10tc.js | 3 + .../dist/assets/chunk-yxgc10tc.js.map | 10 + apps/fabro-web/dist/assets/chunk-yy4ek5m1.js | 3 + .../dist/assets/chunk-yy4ek5m1.js.map | 10 + apps/fabro-web/dist/assets/chunk-z512569f.js | 3 + .../dist/assets/chunk-z512569f.js.map | 10 + apps/fabro-web/dist/assets/chunk-z7w8z7he.js | 3 + .../dist/assets/chunk-z7w8z7he.js.map | 10 + apps/fabro-web/dist/assets/chunk-z9bs2a1h.js | 3 + .../dist/assets/chunk-z9bs2a1h.js.map | 10 + apps/fabro-web/dist/assets/chunk-z9yhre5d.js | 3 + .../dist/assets/chunk-z9yhre5d.js.map | 10 + apps/fabro-web/dist/assets/chunk-zb6gezq1.js | 3 + .../dist/assets/chunk-zb6gezq1.js.map | 10 + apps/fabro-web/dist/assets/chunk-zccvn657.js | 3 + .../dist/assets/chunk-zccvn657.js.map | 10 + apps/fabro-web/dist/assets/chunk-zcmpnmq4.js | 4 + .../dist/assets/chunk-zcmpnmq4.js.map | 10 + apps/fabro-web/dist/assets/chunk-zhw3gev4.js | 3 + .../dist/assets/chunk-zhw3gev4.js.map | 10 + apps/fabro-web/dist/assets/chunk-zjwtp3n6.js | 3 + .../dist/assets/chunk-zjwtp3n6.js.map | 10 + apps/fabro-web/dist/assets/chunk-zv090btz.js | 3 + .../dist/assets/chunk-zv090btz.js.map | 10 + apps/fabro-web/dist/assets/entry-qx60vskn.js | 1944 +++++++++++++++++ .../dist/assets/entry-qx60vskn.js.map | 418 ++++ apps/fabro-web/dist/assets/entry-t2wvsf4c.css | 1 + apps/fabro-web/dist/favicon.ico | Bin 0 -> 2545 bytes apps/fabro-web/dist/favicon.svg | 3 + apps/fabro-web/dist/icon-192.png | Bin 0 -> 8234 bytes apps/fabro-web/dist/icon-512.png | Bin 0 -> 22293 bytes apps/fabro-web/dist/index.html | 376 ++++ apps/fabro-web/dist/logo.svg | 3 + apps/fabro-web/dist/logotype-light.svg | 4 + apps/fabro-web/dist/logotype.svg | 4 + apps/fabro-web/index.template.html | 25 + apps/fabro-web/package.json | 26 +- apps/fabro-web/react-router.config.ts | 7 - apps/fabro-web/scripts/build.ts | 102 + apps/fabro-web/tsconfig.json | 12 +- apps/fabro-web/vite.config.ts | 9 - docs-internal/updating-web-screenshots.md | 2 +- docs/images/how-fabro-works.svg | 4 +- docs/integrations/github.mdx | 2 +- docs/reference/cli.mdx | 2 +- lib/crates/fabro-cli/src/args.rs | 2 +- lib/crates/fabro-cli/src/commands/doctor.rs | 12 +- lib/crates/fabro-cli/src/commands/install.rs | 3 +- lib/crates/fabro-cli/tests/it/cmd/install.rs | 2 +- lib/crates/fabro-config/src/server.rs | 2 +- lib/crates/fabro-server/Cargo.toml | 5 + lib/crates/fabro-server/build.rs | 28 + lib/crates/fabro-server/src/demo/mod.rs | 2 +- lib/crates/fabro-server/src/jwt_auth.rs | 29 +- lib/crates/fabro-server/src/lib.rs | 2 + lib/crates/fabro-server/src/server.rs | 149 +- lib/crates/fabro-server/src/static_files.rs | 105 + lib/crates/fabro-server/src/web_auth.rs | 624 ++++++ lib/crates/fabro-server/tests/it/api.rs | 19 +- lib/crates/fabro-types/src/settings/server.rs | 2 +- test/docs/extract_dots.py | 2 +- 787 files changed, 9150 insertions(+), 1395 deletions(-) delete mode 100644 apps/fabro-web/app/api-client.test.ts delete mode 100644 apps/fabro-web/app/api-client.ts create mode 100644 apps/fabro-web/app/api.ts create mode 100644 apps/fabro-web/app/entry.tsx delete mode 100644 apps/fabro-web/app/lib/config.server.ts delete mode 100644 apps/fabro-web/app/lib/db.server.ts delete mode 100644 apps/fabro-web/app/lib/demo-mode.server.ts delete mode 100644 apps/fabro-web/app/lib/github.server.ts delete mode 100644 apps/fabro-web/app/lib/merge-env.test.ts delete mode 100644 apps/fabro-web/app/lib/merge-env.ts delete mode 100644 apps/fabro-web/app/lib/session-storage.server.ts delete mode 100644 apps/fabro-web/app/lib/session.server.test.ts delete mode 100644 apps/fabro-web/app/lib/session.server.ts create mode 100644 apps/fabro-web/app/router.tsx delete mode 100644 apps/fabro-web/app/routes.ts delete mode 100644 apps/fabro-web/app/routes/auth-callback.tsx delete mode 100644 apps/fabro-web/app/routes/auth-logout.tsx delete mode 100644 apps/fabro-web/app/routes/setup-callback.tsx create mode 100644 apps/fabro-web/app/routes/setup-complete.tsx create mode 100644 apps/fabro-web/dist/apple-touch-icon.png create mode 100644 apps/fabro-web/dist/assets/app.css create mode 100644 apps/fabro-web/dist/assets/chunk-019jygp1.js create mode 100644 apps/fabro-web/dist/assets/chunk-019jygp1.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-02n7dnxd.js create mode 100644 apps/fabro-web/dist/assets/chunk-02n7dnxd.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-05s0gc93.js create mode 100644 apps/fabro-web/dist/assets/chunk-05s0gc93.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-06fm9b6d.js create mode 100644 apps/fabro-web/dist/assets/chunk-06fm9b6d.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-07en1qh1.js create mode 100644 apps/fabro-web/dist/assets/chunk-07en1qh1.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-09p5nycp.js create mode 100644 apps/fabro-web/dist/assets/chunk-09p5nycp.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-0dse7fse.js create mode 100644 apps/fabro-web/dist/assets/chunk-0dse7fse.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-0nc05j52.js create mode 100644 apps/fabro-web/dist/assets/chunk-0nc05j52.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-0pazjatd.js create mode 100644 apps/fabro-web/dist/assets/chunk-0pazjatd.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-0pkns8zn.js create mode 100644 apps/fabro-web/dist/assets/chunk-0pkns8zn.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-0tq24xt3.js create mode 100644 apps/fabro-web/dist/assets/chunk-0tq24xt3.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-11c3h1xt.js create mode 100644 apps/fabro-web/dist/assets/chunk-11c3h1xt.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-11vzjswv.js create mode 100644 apps/fabro-web/dist/assets/chunk-11vzjswv.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-17r63emm.js create mode 100644 apps/fabro-web/dist/assets/chunk-17r63emm.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-18pbarpx.js create mode 100644 apps/fabro-web/dist/assets/chunk-18pbarpx.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-1ezq7eg5.js create mode 100644 apps/fabro-web/dist/assets/chunk-1ezq7eg5.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-1jb7a4x7.js create mode 100644 apps/fabro-web/dist/assets/chunk-1jb7a4x7.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-1wjv325z.js create mode 100644 apps/fabro-web/dist/assets/chunk-1wjv325z.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-1xpescw2.js create mode 100644 apps/fabro-web/dist/assets/chunk-1xpescw2.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-1z6jks96.js create mode 100644 apps/fabro-web/dist/assets/chunk-1z6jks96.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-207mkg9t.js create mode 100644 apps/fabro-web/dist/assets/chunk-207mkg9t.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-2cjhppva.js create mode 100644 apps/fabro-web/dist/assets/chunk-2cjhppva.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-2d0xan0e.js create mode 100644 apps/fabro-web/dist/assets/chunk-2d0xan0e.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-2eh3eq47.js create mode 100644 apps/fabro-web/dist/assets/chunk-2eh3eq47.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-2ndh3q6f.js create mode 100644 apps/fabro-web/dist/assets/chunk-2ndh3q6f.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-2rnptd9f.js create mode 100644 apps/fabro-web/dist/assets/chunk-2rnptd9f.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-2t67c0zp.js create mode 100644 apps/fabro-web/dist/assets/chunk-2t67c0zp.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-2v5x7cyg.js create mode 100644 apps/fabro-web/dist/assets/chunk-2v5x7cyg.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-2xqt91k6.js create mode 100644 apps/fabro-web/dist/assets/chunk-2xqt91k6.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-2z02c7x4.js create mode 100644 apps/fabro-web/dist/assets/chunk-2z02c7x4.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-36rb0g8e.js create mode 100644 apps/fabro-web/dist/assets/chunk-36rb0g8e.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-3bn8ccxt.js create mode 100644 apps/fabro-web/dist/assets/chunk-3bn8ccxt.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-3g84zxfd.js create mode 100644 apps/fabro-web/dist/assets/chunk-3g84zxfd.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-3m9zvayn.js create mode 100644 apps/fabro-web/dist/assets/chunk-3m9zvayn.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-3my0wjn6.js create mode 100644 apps/fabro-web/dist/assets/chunk-3my0wjn6.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-3nbmjrwz.js create mode 100644 apps/fabro-web/dist/assets/chunk-3nbmjrwz.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-3qzmnqbk.js create mode 100644 apps/fabro-web/dist/assets/chunk-3qzmnqbk.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-3rchmqge.js create mode 100644 apps/fabro-web/dist/assets/chunk-3rchmqge.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-3tfe6c9b.js create mode 100644 apps/fabro-web/dist/assets/chunk-3tfe6c9b.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-457408mh.js create mode 100644 apps/fabro-web/dist/assets/chunk-457408mh.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-4833vrwm.js create mode 100644 apps/fabro-web/dist/assets/chunk-4833vrwm.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-48syp4by.js create mode 100644 apps/fabro-web/dist/assets/chunk-48syp4by.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-4bp68sr2.js create mode 100644 apps/fabro-web/dist/assets/chunk-4bp68sr2.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-4g4hkb7x.js create mode 100644 apps/fabro-web/dist/assets/chunk-4g4hkb7x.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-4h0ks3v3.js create mode 100644 apps/fabro-web/dist/assets/chunk-4h0ks3v3.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-4j8a65qz.js create mode 100644 apps/fabro-web/dist/assets/chunk-4j8a65qz.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-4v5fshv2.js create mode 100644 apps/fabro-web/dist/assets/chunk-4v5fshv2.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-50s79t1q.js create mode 100644 apps/fabro-web/dist/assets/chunk-50s79t1q.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-551b9h9v.js create mode 100644 apps/fabro-web/dist/assets/chunk-551b9h9v.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-56hr8ze6.js create mode 100644 apps/fabro-web/dist/assets/chunk-56hr8ze6.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-56ztj47e.js create mode 100644 apps/fabro-web/dist/assets/chunk-56ztj47e.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-5ass1cr8.js create mode 100644 apps/fabro-web/dist/assets/chunk-5ass1cr8.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-5bdrk519.js create mode 100644 apps/fabro-web/dist/assets/chunk-5bdrk519.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-5exp5fdx.js create mode 100644 apps/fabro-web/dist/assets/chunk-5exp5fdx.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-5gqhakby.js create mode 100644 apps/fabro-web/dist/assets/chunk-5gqhakby.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-5w2bs93r.js create mode 100644 apps/fabro-web/dist/assets/chunk-5w2bs93r.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-61ctvdht.js create mode 100644 apps/fabro-web/dist/assets/chunk-61ctvdht.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-63fds60w.js create mode 100644 apps/fabro-web/dist/assets/chunk-63fds60w.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-65xe94t7.js create mode 100644 apps/fabro-web/dist/assets/chunk-65xe94t7.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-6h2erjze.js create mode 100644 apps/fabro-web/dist/assets/chunk-6h2erjze.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-6jf76z88.js create mode 100644 apps/fabro-web/dist/assets/chunk-6jf76z88.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-6jy2cvk9.js create mode 100644 apps/fabro-web/dist/assets/chunk-6jy2cvk9.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-6kg96dj9.js create mode 100644 apps/fabro-web/dist/assets/chunk-6kg96dj9.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-6ma2q84r.js create mode 100644 apps/fabro-web/dist/assets/chunk-6ma2q84r.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-6p6xafmt.js create mode 100644 apps/fabro-web/dist/assets/chunk-6p6xafmt.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-6v4gpbdm.js create mode 100644 apps/fabro-web/dist/assets/chunk-6v4gpbdm.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-6x0cp4ft.js create mode 100644 apps/fabro-web/dist/assets/chunk-6x0cp4ft.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-6xtve84b.js create mode 100644 apps/fabro-web/dist/assets/chunk-6xtve84b.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-6z53j5sy.js create mode 100644 apps/fabro-web/dist/assets/chunk-6z53j5sy.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-72xk2942.js create mode 100644 apps/fabro-web/dist/assets/chunk-72xk2942.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-75fy5bdm.js create mode 100644 apps/fabro-web/dist/assets/chunk-75fy5bdm.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-78zbagrn.js create mode 100644 apps/fabro-web/dist/assets/chunk-78zbagrn.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-79ywv1g9.js create mode 100644 apps/fabro-web/dist/assets/chunk-79ywv1g9.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-7bh2jdae.js create mode 100644 apps/fabro-web/dist/assets/chunk-7bh2jdae.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-7ehscpxq.js create mode 100644 apps/fabro-web/dist/assets/chunk-7ehscpxq.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-7f3p0xqq.js create mode 100644 apps/fabro-web/dist/assets/chunk-7f3p0xqq.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-7r410k8q.js create mode 100644 apps/fabro-web/dist/assets/chunk-7r410k8q.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-7vrbbh2r.js create mode 100644 apps/fabro-web/dist/assets/chunk-7vrbbh2r.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-7wezvt4b.js create mode 100644 apps/fabro-web/dist/assets/chunk-7wezvt4b.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-87fva4et.js create mode 100644 apps/fabro-web/dist/assets/chunk-87fva4et.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-8c9bs2ba.js create mode 100644 apps/fabro-web/dist/assets/chunk-8c9bs2ba.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-8mdqjrtg.js create mode 100644 apps/fabro-web/dist/assets/chunk-8mdqjrtg.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-8mhds0wh.js create mode 100644 apps/fabro-web/dist/assets/chunk-8mhds0wh.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-8n4az5gq.js create mode 100644 apps/fabro-web/dist/assets/chunk-8n4az5gq.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-8peyj85j.js create mode 100644 apps/fabro-web/dist/assets/chunk-8peyj85j.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-8v6fnbbx.js create mode 100644 apps/fabro-web/dist/assets/chunk-8v6fnbbx.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-8xd3q6bh.js create mode 100644 apps/fabro-web/dist/assets/chunk-8xd3q6bh.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-8yfxtt5d.js create mode 100644 apps/fabro-web/dist/assets/chunk-8yfxtt5d.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-8z0qc74b.js create mode 100644 apps/fabro-web/dist/assets/chunk-8z0qc74b.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-8z6nk9f0.js create mode 100644 apps/fabro-web/dist/assets/chunk-8z6nk9f0.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-902g9fxx.js create mode 100644 apps/fabro-web/dist/assets/chunk-902g9fxx.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-90hhq6ga.js create mode 100644 apps/fabro-web/dist/assets/chunk-90hhq6ga.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-90qzx8bn.js create mode 100644 apps/fabro-web/dist/assets/chunk-90qzx8bn.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-9101h887.js create mode 100644 apps/fabro-web/dist/assets/chunk-9101h887.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-920h6h23.js create mode 100644 apps/fabro-web/dist/assets/chunk-920h6h23.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-96gcsfr8.js create mode 100644 apps/fabro-web/dist/assets/chunk-96gcsfr8.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-987ve6q9.js create mode 100644 apps/fabro-web/dist/assets/chunk-987ve6q9.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-98k5hywg.js create mode 100644 apps/fabro-web/dist/assets/chunk-98k5hywg.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-9c29ggzn.js create mode 100644 apps/fabro-web/dist/assets/chunk-9c29ggzn.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-9de8zztk.js create mode 100644 apps/fabro-web/dist/assets/chunk-9de8zztk.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-9e1qwkc0.js create mode 100644 apps/fabro-web/dist/assets/chunk-9e1qwkc0.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-9exrs9cr.js create mode 100644 apps/fabro-web/dist/assets/chunk-9exrs9cr.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-9mnmk4y2.js create mode 100644 apps/fabro-web/dist/assets/chunk-9mnmk4y2.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-9t57pdty.js create mode 100644 apps/fabro-web/dist/assets/chunk-9t57pdty.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-9t6ftmv1.js create mode 100644 apps/fabro-web/dist/assets/chunk-9t6ftmv1.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-9w9wrmb8.js create mode 100644 apps/fabro-web/dist/assets/chunk-9w9wrmb8.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-9ymzkh14.js create mode 100644 apps/fabro-web/dist/assets/chunk-9ymzkh14.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-9yxtr6b6.js create mode 100644 apps/fabro-web/dist/assets/chunk-9yxtr6b6.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-a24qcegx.js create mode 100644 apps/fabro-web/dist/assets/chunk-a24qcegx.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-a47kj248.js create mode 100644 apps/fabro-web/dist/assets/chunk-a47kj248.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-a9g0d87v.js create mode 100644 apps/fabro-web/dist/assets/chunk-a9g0d87v.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ab4vmcds.js create mode 100644 apps/fabro-web/dist/assets/chunk-ab4vmcds.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-acsgr2m8.js create mode 100644 apps/fabro-web/dist/assets/chunk-acsgr2m8.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ah94fbbe.js create mode 100644 apps/fabro-web/dist/assets/chunk-ah94fbbe.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-aj9s5f9k.js create mode 100644 apps/fabro-web/dist/assets/chunk-aj9s5f9k.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-akwfy8wn.js create mode 100644 apps/fabro-web/dist/assets/chunk-akwfy8wn.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-armxp3zn.js create mode 100644 apps/fabro-web/dist/assets/chunk-armxp3zn.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-avgm78q3.js create mode 100644 apps/fabro-web/dist/assets/chunk-avgm78q3.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-awbzcd9m.js create mode 100644 apps/fabro-web/dist/assets/chunk-awbzcd9m.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-b173jpp2.js create mode 100644 apps/fabro-web/dist/assets/chunk-b173jpp2.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-b1sy5kac.js create mode 100644 apps/fabro-web/dist/assets/chunk-b1sy5kac.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ba2typew.js create mode 100644 apps/fabro-web/dist/assets/chunk-ba2typew.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-baw4wjvc.js create mode 100644 apps/fabro-web/dist/assets/chunk-baw4wjvc.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-bbjv3mcf.js create mode 100644 apps/fabro-web/dist/assets/chunk-bbjv3mcf.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-bcp47gas.js create mode 100644 apps/fabro-web/dist/assets/chunk-bcp47gas.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-be463r1s.js create mode 100644 apps/fabro-web/dist/assets/chunk-be463r1s.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-bj6rb0tc.js create mode 100644 apps/fabro-web/dist/assets/chunk-bj6rb0tc.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-btpdjb6n.js create mode 100644 apps/fabro-web/dist/assets/chunk-btpdjb6n.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-byx1xjhw.js create mode 100644 apps/fabro-web/dist/assets/chunk-byx1xjhw.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-c4pk66bt.js create mode 100644 apps/fabro-web/dist/assets/chunk-c4pk66bt.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-c5mjg0qf.js create mode 100644 apps/fabro-web/dist/assets/chunk-c5mjg0qf.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-c6gysrv0.js create mode 100644 apps/fabro-web/dist/assets/chunk-c6gysrv0.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-c6h3n9wp.js create mode 100644 apps/fabro-web/dist/assets/chunk-c6h3n9wp.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-c7dsx0a3.js create mode 100644 apps/fabro-web/dist/assets/chunk-c7dsx0a3.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-c9cv6qdm.js create mode 100644 apps/fabro-web/dist/assets/chunk-c9cv6qdm.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-cfknpdwe.js create mode 100644 apps/fabro-web/dist/assets/chunk-cfknpdwe.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-cfqkkm9n.js create mode 100644 apps/fabro-web/dist/assets/chunk-cfqkkm9n.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-chsjnf53.js create mode 100644 apps/fabro-web/dist/assets/chunk-chsjnf53.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-chywzwk3.js create mode 100644 apps/fabro-web/dist/assets/chunk-chywzwk3.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-csfvbt7s.js create mode 100644 apps/fabro-web/dist/assets/chunk-csfvbt7s.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-csnb7rks.js create mode 100644 apps/fabro-web/dist/assets/chunk-csnb7rks.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-cvdkeqcs.js create mode 100644 apps/fabro-web/dist/assets/chunk-cvdkeqcs.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-cws2ks36.js create mode 100644 apps/fabro-web/dist/assets/chunk-cws2ks36.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-cyr7gkwx.js create mode 100644 apps/fabro-web/dist/assets/chunk-cyr7gkwx.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-d0p7g53p.js create mode 100644 apps/fabro-web/dist/assets/chunk-d0p7g53p.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-d2pbkwzw.js create mode 100644 apps/fabro-web/dist/assets/chunk-d2pbkwzw.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-d2rnnscz.js create mode 100644 apps/fabro-web/dist/assets/chunk-d2rnnscz.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-d6xt8xhc.js create mode 100644 apps/fabro-web/dist/assets/chunk-d6xt8xhc.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-d8s6b9rv.js create mode 100644 apps/fabro-web/dist/assets/chunk-d8s6b9rv.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-d97t3fd8.js create mode 100644 apps/fabro-web/dist/assets/chunk-d97t3fd8.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-dd3vxa06.js create mode 100644 apps/fabro-web/dist/assets/chunk-dd3vxa06.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-dn6szkja.js create mode 100644 apps/fabro-web/dist/assets/chunk-dn6szkja.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-dn79dghe.js create mode 100644 apps/fabro-web/dist/assets/chunk-dn79dghe.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-dvna8fze.js create mode 100644 apps/fabro-web/dist/assets/chunk-dvna8fze.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-e1mesqtx.js create mode 100644 apps/fabro-web/dist/assets/chunk-e1mesqtx.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-eachxzks.js create mode 100644 apps/fabro-web/dist/assets/chunk-eachxzks.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-eaexpy25.js create mode 100644 apps/fabro-web/dist/assets/chunk-eaexpy25.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ebraw617.js create mode 100644 apps/fabro-web/dist/assets/chunk-ebraw617.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ee5ffmv7.js create mode 100644 apps/fabro-web/dist/assets/chunk-ee5ffmv7.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-eew9p379.js create mode 100644 apps/fabro-web/dist/assets/chunk-eew9p379.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ef8450p6.js create mode 100644 apps/fabro-web/dist/assets/chunk-ef8450p6.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-em0zsd82.js create mode 100644 apps/fabro-web/dist/assets/chunk-em0zsd82.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-erxdztbx.js create mode 100644 apps/fabro-web/dist/assets/chunk-erxdztbx.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-esbzyb57.js create mode 100644 apps/fabro-web/dist/assets/chunk-esbzyb57.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-etxafnd6.js create mode 100644 apps/fabro-web/dist/assets/chunk-etxafnd6.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-f34ztz5g.js create mode 100644 apps/fabro-web/dist/assets/chunk-f34ztz5g.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-f3tyqdty.js create mode 100644 apps/fabro-web/dist/assets/chunk-f3tyqdty.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-fbwa2cfs.js create mode 100644 apps/fabro-web/dist/assets/chunk-fbwa2cfs.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-fjy7665g.js create mode 100644 apps/fabro-web/dist/assets/chunk-fjy7665g.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-fk8hckdh.js create mode 100644 apps/fabro-web/dist/assets/chunk-fk8hckdh.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-fkyxb6ae.js create mode 100644 apps/fabro-web/dist/assets/chunk-fkyxb6ae.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-fvbhfjt0.js create mode 100644 apps/fabro-web/dist/assets/chunk-fvbhfjt0.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-fwdy1tf5.js create mode 100644 apps/fabro-web/dist/assets/chunk-fwdy1tf5.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-fyxavgx7.js create mode 100644 apps/fabro-web/dist/assets/chunk-fyxavgx7.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-fzakadrz.js create mode 100644 apps/fabro-web/dist/assets/chunk-fzakadrz.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-g1zh8k8v.js create mode 100644 apps/fabro-web/dist/assets/chunk-g1zh8k8v.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-g3527668.js create mode 100644 apps/fabro-web/dist/assets/chunk-g3527668.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ga01y5x5.js create mode 100644 apps/fabro-web/dist/assets/chunk-ga01y5x5.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-gf5c68z4.js create mode 100644 apps/fabro-web/dist/assets/chunk-gf5c68z4.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ggpkgcfa.js create mode 100644 apps/fabro-web/dist/assets/chunk-ggpkgcfa.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ghad1e1w.js create mode 100644 apps/fabro-web/dist/assets/chunk-ghad1e1w.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-gq03p1hd.js create mode 100644 apps/fabro-web/dist/assets/chunk-gq03p1hd.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-gwjyp4yd.js create mode 100644 apps/fabro-web/dist/assets/chunk-gwjyp4yd.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-h7f0amn3.js create mode 100644 apps/fabro-web/dist/assets/chunk-h7f0amn3.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-hd5d17zs.js create mode 100644 apps/fabro-web/dist/assets/chunk-hd5d17zs.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-hgjbbj4c.js create mode 100644 apps/fabro-web/dist/assets/chunk-hgjbbj4c.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-hhx1aavy.js create mode 100644 apps/fabro-web/dist/assets/chunk-hhx1aavy.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-hmhkhxp2.js create mode 100644 apps/fabro-web/dist/assets/chunk-hmhkhxp2.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-htahhx45.js create mode 100644 apps/fabro-web/dist/assets/chunk-htahhx45.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-j4nm0wg8.js create mode 100644 apps/fabro-web/dist/assets/chunk-j4nm0wg8.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-j75cbz63.js create mode 100644 apps/fabro-web/dist/assets/chunk-j75cbz63.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-jc1vw5fd.js create mode 100644 apps/fabro-web/dist/assets/chunk-jc1vw5fd.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-jc9zdc67.js create mode 100644 apps/fabro-web/dist/assets/chunk-jc9zdc67.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-jemhbdxk.js create mode 100644 apps/fabro-web/dist/assets/chunk-jemhbdxk.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-jfjf0jp7.js create mode 100644 apps/fabro-web/dist/assets/chunk-jfjf0jp7.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-jpbad646.js create mode 100644 apps/fabro-web/dist/assets/chunk-jpbad646.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-jtbngvde.js create mode 100644 apps/fabro-web/dist/assets/chunk-jtbngvde.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-jtffthwb.js create mode 100644 apps/fabro-web/dist/assets/chunk-jtffthwb.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-jvygjw94.js create mode 100644 apps/fabro-web/dist/assets/chunk-jvygjw94.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-k0s3svvy.js create mode 100644 apps/fabro-web/dist/assets/chunk-k0s3svvy.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-k28qfdjw.js create mode 100644 apps/fabro-web/dist/assets/chunk-k28qfdjw.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-k5jdp2xd.js create mode 100644 apps/fabro-web/dist/assets/chunk-k5jdp2xd.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-k7ynz5mz.js create mode 100644 apps/fabro-web/dist/assets/chunk-k7ynz5mz.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-k8m07by6.js create mode 100644 apps/fabro-web/dist/assets/chunk-k8m07by6.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-kaj4vs6d.js create mode 100644 apps/fabro-web/dist/assets/chunk-kaj4vs6d.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-kb76fs43.js create mode 100644 apps/fabro-web/dist/assets/chunk-kb76fs43.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-kdjgd0g9.js create mode 100644 apps/fabro-web/dist/assets/chunk-kdjgd0g9.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ke79syqy.js create mode 100644 apps/fabro-web/dist/assets/chunk-ke79syqy.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-kgq5332v.js create mode 100644 apps/fabro-web/dist/assets/chunk-kgq5332v.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-km5w7dec.js create mode 100644 apps/fabro-web/dist/assets/chunk-km5w7dec.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-kqq1a30a.js create mode 100644 apps/fabro-web/dist/assets/chunk-kqq1a30a.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-kv06br00.js create mode 100644 apps/fabro-web/dist/assets/chunk-kv06br00.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-kxn7andw.js create mode 100644 apps/fabro-web/dist/assets/chunk-kxn7andw.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-kxzd3ypz.js create mode 100644 apps/fabro-web/dist/assets/chunk-kxzd3ypz.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ky56e8mk.js create mode 100644 apps/fabro-web/dist/assets/chunk-ky56e8mk.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-m2sbqbtm.js create mode 100644 apps/fabro-web/dist/assets/chunk-m2sbqbtm.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-m76mdd1n.js create mode 100644 apps/fabro-web/dist/assets/chunk-m76mdd1n.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-m8j14bjr.js create mode 100644 apps/fabro-web/dist/assets/chunk-m8j14bjr.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-mbdgfkdv.js create mode 100644 apps/fabro-web/dist/assets/chunk-mbdgfkdv.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-mbpm8tp5.js create mode 100644 apps/fabro-web/dist/assets/chunk-mbpm8tp5.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-mjacvcxt.js create mode 100644 apps/fabro-web/dist/assets/chunk-mjacvcxt.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-mkrka56j.js create mode 100644 apps/fabro-web/dist/assets/chunk-mkrka56j.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-mmwq9sqb.js create mode 100644 apps/fabro-web/dist/assets/chunk-mmwq9sqb.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-mshhqkhw.js create mode 100644 apps/fabro-web/dist/assets/chunk-mshhqkhw.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-my086dk6.js create mode 100644 apps/fabro-web/dist/assets/chunk-my086dk6.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-n1k68xa8.js create mode 100644 apps/fabro-web/dist/assets/chunk-n1k68xa8.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-n2yspqr0.js create mode 100644 apps/fabro-web/dist/assets/chunk-n2yspqr0.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-n3vkfzf2.js create mode 100644 apps/fabro-web/dist/assets/chunk-n3vkfzf2.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-n46mdkj2.js create mode 100644 apps/fabro-web/dist/assets/chunk-n46mdkj2.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-nb7r3qa9.js create mode 100644 apps/fabro-web/dist/assets/chunk-nb7r3qa9.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ndd1s58m.js create mode 100644 apps/fabro-web/dist/assets/chunk-ndd1s58m.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ndrfe9w3.js create mode 100644 apps/fabro-web/dist/assets/chunk-ndrfe9w3.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-nk5ky6zd.js create mode 100644 apps/fabro-web/dist/assets/chunk-nk5ky6zd.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-npf8ns55.js create mode 100644 apps/fabro-web/dist/assets/chunk-npf8ns55.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-nr8rrtg9.js create mode 100644 apps/fabro-web/dist/assets/chunk-nr8rrtg9.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-nsg7r6pt.js create mode 100644 apps/fabro-web/dist/assets/chunk-nsg7r6pt.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-p01md5kb.js create mode 100644 apps/fabro-web/dist/assets/chunk-p01md5kb.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-p14884cp.js create mode 100644 apps/fabro-web/dist/assets/chunk-p14884cp.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-p59yzxc1.js create mode 100644 apps/fabro-web/dist/assets/chunk-p59yzxc1.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-p5b70qpc.js create mode 100644 apps/fabro-web/dist/assets/chunk-p5b70qpc.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-p7fc4tsd.js create mode 100644 apps/fabro-web/dist/assets/chunk-p7fc4tsd.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-pd6abytg.js create mode 100644 apps/fabro-web/dist/assets/chunk-pd6abytg.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-pectm3zk.js create mode 100644 apps/fabro-web/dist/assets/chunk-pectm3zk.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-phcaqr54.js create mode 100644 apps/fabro-web/dist/assets/chunk-phcaqr54.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-pmaq1598.js create mode 100644 apps/fabro-web/dist/assets/chunk-pmaq1598.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-pmthkscp.js create mode 100644 apps/fabro-web/dist/assets/chunk-pmthkscp.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-pn8pe904.js create mode 100644 apps/fabro-web/dist/assets/chunk-pn8pe904.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-pncyzxg8.js create mode 100644 apps/fabro-web/dist/assets/chunk-pncyzxg8.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-psq81tp2.js create mode 100644 apps/fabro-web/dist/assets/chunk-psq81tp2.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ptvkbn7g.js create mode 100644 apps/fabro-web/dist/assets/chunk-ptvkbn7g.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-q07bg6gn.js create mode 100644 apps/fabro-web/dist/assets/chunk-q07bg6gn.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-q0vrryxz.js create mode 100644 apps/fabro-web/dist/assets/chunk-q0vrryxz.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-q2qv5qr4.js create mode 100644 apps/fabro-web/dist/assets/chunk-q2qv5qr4.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-q39a3r2f.js create mode 100644 apps/fabro-web/dist/assets/chunk-q39a3r2f.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-q3g4jpcq.js create mode 100644 apps/fabro-web/dist/assets/chunk-q3g4jpcq.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-q65fbn3b.js create mode 100644 apps/fabro-web/dist/assets/chunk-q65fbn3b.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-q6h0xf66.js create mode 100644 apps/fabro-web/dist/assets/chunk-q6h0xf66.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-q6ham3g2.js create mode 100644 apps/fabro-web/dist/assets/chunk-q6ham3g2.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-qaxg1f9d.js create mode 100644 apps/fabro-web/dist/assets/chunk-qaxg1f9d.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-qb2gzhv8.js create mode 100644 apps/fabro-web/dist/assets/chunk-qb2gzhv8.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-qde7gss3.js create mode 100644 apps/fabro-web/dist/assets/chunk-qde7gss3.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-qfxxt7qs.js create mode 100644 apps/fabro-web/dist/assets/chunk-qfxxt7qs.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-qnfzgtdb.js create mode 100644 apps/fabro-web/dist/assets/chunk-qnfzgtdb.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-qpmc3wjq.js create mode 100644 apps/fabro-web/dist/assets/chunk-qpmc3wjq.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-qrfhzdgw.js create mode 100644 apps/fabro-web/dist/assets/chunk-qrfhzdgw.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-qs7etptz.js create mode 100644 apps/fabro-web/dist/assets/chunk-qs7etptz.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-qw1h4rez.js create mode 100644 apps/fabro-web/dist/assets/chunk-qw1h4rez.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-qz4nw45n.js create mode 100644 apps/fabro-web/dist/assets/chunk-qz4nw45n.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-r2w3cygs.js create mode 100644 apps/fabro-web/dist/assets/chunk-r2w3cygs.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-r5kt8fba.js create mode 100644 apps/fabro-web/dist/assets/chunk-r5kt8fba.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-r75z3brq.js create mode 100644 apps/fabro-web/dist/assets/chunk-r75z3brq.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-r9hd67p9.js create mode 100644 apps/fabro-web/dist/assets/chunk-r9hd67p9.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-rapg8dhf.js create mode 100644 apps/fabro-web/dist/assets/chunk-rapg8dhf.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-rbfg5snd.js create mode 100644 apps/fabro-web/dist/assets/chunk-rbfg5snd.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-rcqepjsk.js create mode 100644 apps/fabro-web/dist/assets/chunk-rcqepjsk.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-rgez69q8.js create mode 100644 apps/fabro-web/dist/assets/chunk-rgez69q8.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-rh0e3ajf.js create mode 100644 apps/fabro-web/dist/assets/chunk-rh0e3ajf.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-rsph5pvm.js create mode 100644 apps/fabro-web/dist/assets/chunk-rsph5pvm.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-sadshphz.js create mode 100644 apps/fabro-web/dist/assets/chunk-sadshphz.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-sbh2grtg.js create mode 100644 apps/fabro-web/dist/assets/chunk-sbh2grtg.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-sbn8gekr.js create mode 100644 apps/fabro-web/dist/assets/chunk-sbn8gekr.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-smdcgjwd.js create mode 100644 apps/fabro-web/dist/assets/chunk-smdcgjwd.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-svjx2h8c.js create mode 100644 apps/fabro-web/dist/assets/chunk-svjx2h8c.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-svns442s.js create mode 100644 apps/fabro-web/dist/assets/chunk-svns442s.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-sxph8y9z.js create mode 100644 apps/fabro-web/dist/assets/chunk-sxph8y9z.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-t0m0y0zg.js create mode 100644 apps/fabro-web/dist/assets/chunk-t0m0y0zg.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-t2049s6y.js create mode 100644 apps/fabro-web/dist/assets/chunk-t2049s6y.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-t2f2nqdv.js create mode 100644 apps/fabro-web/dist/assets/chunk-t2f2nqdv.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-t5bjexfm.js create mode 100644 apps/fabro-web/dist/assets/chunk-t5bjexfm.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-t8zbyt7b.js create mode 100644 apps/fabro-web/dist/assets/chunk-t8zbyt7b.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-t93s8qrg.js create mode 100644 apps/fabro-web/dist/assets/chunk-t93s8qrg.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-t9d9v6n6.js create mode 100644 apps/fabro-web/dist/assets/chunk-t9d9v6n6.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-tc62g36x.js create mode 100644 apps/fabro-web/dist/assets/chunk-tc62g36x.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-tfvpfprw.js create mode 100644 apps/fabro-web/dist/assets/chunk-tfvpfprw.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-tjs01n4p.js create mode 100644 apps/fabro-web/dist/assets/chunk-tjs01n4p.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-tjzzpcck.js create mode 100644 apps/fabro-web/dist/assets/chunk-tjzzpcck.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-tk854k1k.js create mode 100644 apps/fabro-web/dist/assets/chunk-tk854k1k.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-tkb7chq0.js create mode 100644 apps/fabro-web/dist/assets/chunk-tkb7chq0.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-tqzz87j8.js create mode 100644 apps/fabro-web/dist/assets/chunk-tqzz87j8.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-trdkyqje.js create mode 100644 apps/fabro-web/dist/assets/chunk-trdkyqje.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-trhe0hqm.js create mode 100644 apps/fabro-web/dist/assets/chunk-trhe0hqm.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ttnh8s6j.js create mode 100644 apps/fabro-web/dist/assets/chunk-ttnh8s6j.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-tv34b2xa.js create mode 100644 apps/fabro-web/dist/assets/chunk-tv34b2xa.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-tx0vzgf6.js create mode 100644 apps/fabro-web/dist/assets/chunk-tx0vzgf6.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-txw8s4xq.js create mode 100644 apps/fabro-web/dist/assets/chunk-txw8s4xq.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-v2bk3hqh.js create mode 100644 apps/fabro-web/dist/assets/chunk-v2bk3hqh.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-v61ks9f7.js create mode 100644 apps/fabro-web/dist/assets/chunk-v61ks9f7.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-v9ftnkm2.js create mode 100644 apps/fabro-web/dist/assets/chunk-v9ftnkm2.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-vb08mr9g.js create mode 100644 apps/fabro-web/dist/assets/chunk-vb08mr9g.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-vb7qqcne.js create mode 100644 apps/fabro-web/dist/assets/chunk-vb7qqcne.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-vc7h2mcw.js create mode 100644 apps/fabro-web/dist/assets/chunk-vc7h2mcw.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-vjx23yxz.js create mode 100644 apps/fabro-web/dist/assets/chunk-vjx23yxz.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-vkqn43a3.js create mode 100644 apps/fabro-web/dist/assets/chunk-vkqn43a3.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-vnxhvf32.js create mode 100644 apps/fabro-web/dist/assets/chunk-vnxhvf32.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-vyvre5f7.js create mode 100644 apps/fabro-web/dist/assets/chunk-vyvre5f7.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-vz6zae36.js create mode 100644 apps/fabro-web/dist/assets/chunk-vz6zae36.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-vznmwsj2.js create mode 100644 apps/fabro-web/dist/assets/chunk-vznmwsj2.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-w0p583k6.js create mode 100644 apps/fabro-web/dist/assets/chunk-w0p583k6.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-w24seer2.js create mode 100644 apps/fabro-web/dist/assets/chunk-w24seer2.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-w4txx8sc.js create mode 100644 apps/fabro-web/dist/assets/chunk-w4txx8sc.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-wk8q2ejk.js create mode 100644 apps/fabro-web/dist/assets/chunk-wk8q2ejk.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-wq7vfert.js create mode 100644 apps/fabro-web/dist/assets/chunk-wq7vfert.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-wv916p92.js create mode 100644 apps/fabro-web/dist/assets/chunk-wv916p92.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-wx1qv58v.js create mode 100644 apps/fabro-web/dist/assets/chunk-wx1qv58v.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-wyhemkn7.js create mode 100644 apps/fabro-web/dist/assets/chunk-wyhemkn7.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-wzb9zsp9.js create mode 100644 apps/fabro-web/dist/assets/chunk-wzb9zsp9.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-x4p58zc4.js create mode 100644 apps/fabro-web/dist/assets/chunk-x4p58zc4.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-xbsshqee.js create mode 100644 apps/fabro-web/dist/assets/chunk-xbsshqee.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-xcxrzfy1.js create mode 100644 apps/fabro-web/dist/assets/chunk-xcxrzfy1.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-xr25x186.js create mode 100644 apps/fabro-web/dist/assets/chunk-xr25x186.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-xsg5yrft.js create mode 100644 apps/fabro-web/dist/assets/chunk-xsg5yrft.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-xsjq18b3.js create mode 100644 apps/fabro-web/dist/assets/chunk-xsjq18b3.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-xvjs9feb.js create mode 100644 apps/fabro-web/dist/assets/chunk-xvjs9feb.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-yc4p6sd7.js create mode 100644 apps/fabro-web/dist/assets/chunk-yc4p6sd7.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-yj17k4xm.js create mode 100644 apps/fabro-web/dist/assets/chunk-yj17k4xm.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ym5wbpcw.js create mode 100644 apps/fabro-web/dist/assets/chunk-ym5wbpcw.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-yme4dsd5.js create mode 100644 apps/fabro-web/dist/assets/chunk-yme4dsd5.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-ysp46zk7.js create mode 100644 apps/fabro-web/dist/assets/chunk-ysp46zk7.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-yxgc10tc.js create mode 100644 apps/fabro-web/dist/assets/chunk-yxgc10tc.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-yy4ek5m1.js create mode 100644 apps/fabro-web/dist/assets/chunk-yy4ek5m1.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-z512569f.js create mode 100644 apps/fabro-web/dist/assets/chunk-z512569f.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-z7w8z7he.js create mode 100644 apps/fabro-web/dist/assets/chunk-z7w8z7he.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-z9bs2a1h.js create mode 100644 apps/fabro-web/dist/assets/chunk-z9bs2a1h.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-z9yhre5d.js create mode 100644 apps/fabro-web/dist/assets/chunk-z9yhre5d.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-zb6gezq1.js create mode 100644 apps/fabro-web/dist/assets/chunk-zb6gezq1.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-zccvn657.js create mode 100644 apps/fabro-web/dist/assets/chunk-zccvn657.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-zcmpnmq4.js create mode 100644 apps/fabro-web/dist/assets/chunk-zcmpnmq4.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-zhw3gev4.js create mode 100644 apps/fabro-web/dist/assets/chunk-zhw3gev4.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-zjwtp3n6.js create mode 100644 apps/fabro-web/dist/assets/chunk-zjwtp3n6.js.map create mode 100644 apps/fabro-web/dist/assets/chunk-zv090btz.js create mode 100644 apps/fabro-web/dist/assets/chunk-zv090btz.js.map create mode 100644 apps/fabro-web/dist/assets/entry-qx60vskn.js create mode 100644 apps/fabro-web/dist/assets/entry-qx60vskn.js.map create mode 100644 apps/fabro-web/dist/assets/entry-t2wvsf4c.css create mode 100644 apps/fabro-web/dist/favicon.ico create mode 100644 apps/fabro-web/dist/favicon.svg create mode 100644 apps/fabro-web/dist/icon-192.png create mode 100644 apps/fabro-web/dist/icon-512.png create mode 100644 apps/fabro-web/dist/index.html create mode 100644 apps/fabro-web/dist/logo.svg create mode 100644 apps/fabro-web/dist/logotype-light.svg create mode 100644 apps/fabro-web/dist/logotype.svg create mode 100644 apps/fabro-web/index.template.html delete mode 100644 apps/fabro-web/react-router.config.ts create mode 100644 apps/fabro-web/scripts/build.ts delete mode 100644 apps/fabro-web/vite.config.ts create mode 100644 lib/crates/fabro-server/build.rs create mode 100644 lib/crates/fabro-server/src/static_files.rs create mode 100644 lib/crates/fabro-server/src/web_auth.rs diff --git a/Cargo.lock b/Cargo.lock index 397988c6d..63d8ddcd5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,41 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + [[package]] name = "ahash" version = "0.8.12" @@ -386,6 +421,29 @@ dependencies = [ "tracing", ] +[[package]] +name = "axum-extra" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9963ff19f40c6102c76756ef0a46004c0d58957d87259fc9208ff8441c12ab96" +dependencies = [ + "axum", + "axum-core", + "bytes", + "cookie", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "serde_core", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "axum-macros" version = "0.5.0" @@ -618,6 +676,16 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clap" version = "4.5.60" @@ -748,6 +816,24 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "aes-gcm", + "base64", + "hkdf", + "hmac", + "percent-encoding", + "rand 0.8.5", + "sha2", + "subtle", + "time", + "version_check", +] + [[package]] name = "coolor" version = "1.1.0" @@ -942,9 +1028,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + [[package]] name = "darling" version = "0.14.4" @@ -1819,10 +1915,12 @@ version = "0.176.2" dependencies = [ "anyhow", "axum", + "axum-extra", "base64", "bytes", "chrono", "clap", + "cookie", "dirs", "fabro-agent", "fabro-api-types", @@ -1847,9 +1945,12 @@ dependencies = [ "hyper", "hyper-util", "jsonwebtoken", + "mime_guess", "object_store", "openapiv3", + "rand 0.8.5", "reqwest", + "rust-embed", "rustls", "rustls-pemfile", "rustls-pki-types", @@ -2513,6 +2614,16 @@ dependencies = [ "wasip3", ] +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + [[package]] name = "gimli" version = "0.32.3" @@ -3094,6 +3205,15 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + [[package]] name = "insta" version = "1.46.3" @@ -4040,6 +4160,12 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "open" version = "5.3.3" @@ -4417,6 +4543,18 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "portable-atomic" version = "1.13.1" @@ -4927,6 +5065,40 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rust-embed" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04113cb9355a377d83f06ef1f0a45b8ab8cd7d8b1288160717d66df5c7988d27" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0902e4c7c8e997159ab384e6d0fc91c221375f6894346ae107f47dd0f3ccaa" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn 2.0.117", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1" +dependencies = [ + "sha2", + "walkdir", +] + [[package]] name = "rust_decimal" version = "1.41.0" @@ -6677,6 +6849,16 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + [[package]] name = "unsafe-libyaml" version = "0.2.11" diff --git a/Cargo.toml b/Cargo.toml index 1ab3e532d..eb0eac9d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,8 @@ license = "MIT" [workspace.dependencies] anyhow = "1" axum = { version = "0.8" } +axum-extra = { version = "0.10", features = ["cookie-private"] } +cookie = { version = "0.18", features = ["percent-encode", "private", "signed", "key-expansion"] } thiserror = "2" serde = { version = "1", features = ["derive"] } serde_json = { version = "1", features = ["preserve_order"] } @@ -69,6 +71,7 @@ fork = "0.2" exec = "0.3" slatedb = "0.11.2" object_store = "0.12.5" +rust-embed = "8" [workspace.lints.rust] unsafe_code = "deny" diff --git a/apps/fabro-web/app/api-client.test.ts b/apps/fabro-web/app/api-client.test.ts deleted file mode 100644 index b77950166..000000000 --- a/apps/fabro-web/app/api-client.test.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { describe, test, expect, beforeEach, mock } from "bun:test"; -import { apiJson } from "./api-client"; - -const originalFetch = globalThis.fetch; - -beforeEach(() => { - globalThis.fetch = originalFetch; -}); - -describe("apiJson", () => { - test("returns parsed JSON on 200", async () => { - globalThis.fetch = mock(() => - Promise.resolve(new Response(JSON.stringify({ id: 1, name: "test" }), { - status: 200, - headers: { "Content-Type": "application/json" }, - })) - ); - - const result = await apiJson<{ id: number; name: string }>("/items/1"); - - expect(result).toEqual({ id: 1, name: "test" }); - }); - - test("throws Response with status 404 and null body on not found", async () => { - globalThis.fetch = mock(() => - Promise.resolve(new Response("Not Found: /items/999", { status: 404 })) - ); - - try { - await apiJson("/items/999"); - expect.unreachable("should have thrown"); - } catch (thrown) { - expect(thrown).toBeInstanceOf(Response); - const res = thrown as Response; - expect(res.status).toBe(404); - expect(res.body).toBeNull(); - } - }); - - test("throws Response with status 500 and null body, stripping sensitive details", async () => { - globalThis.fetch = mock(() => - Promise.resolve( - new Response( - "Internal error: database connection string is postgres://admin:secret@db.internal:5432/prod", - { status: 500 } - ) - ) - ); - - try { - await apiJson("/items/1"); - expect.unreachable("should have thrown"); - } catch (thrown) { - expect(thrown).toBeInstanceOf(Response); - const res = thrown as Response; - expect(res.status).toBe(500); - expect(res.body).toBeNull(); - } - }); -}); diff --git a/apps/fabro-web/app/api-client.ts b/apps/fabro-web/app/api-client.ts deleted file mode 100644 index 912314e79..000000000 --- a/apps/fabro-web/app/api-client.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { importPKCS8, SignJWT } from "jose"; -import { getAppConfig } from "./lib/config.server"; -import { isDemoMode } from "./lib/demo-mode.server"; -import { getUser } from "./lib/session.server"; - -const FABRO_JWT_PRIVATE_KEY = process.env.FABRO_JWT_PRIVATE_KEY; - -function decodePemEnv(value: string): string { - if (value.startsWith("-----")) return value; - return Buffer.from(value, "base64").toString("utf-8"); -} - -let cachedKey: CryptoKey | null = null; - -async function getSigningKey(): Promise { - if (cachedKey) return cachedKey; - if (!FABRO_JWT_PRIVATE_KEY) { - throw new Error("FABRO_JWT_PRIVATE_KEY environment variable is not set"); - } - cachedKey = await importPKCS8(decodePemEnv(FABRO_JWT_PRIVATE_KEY), "EdDSA"); - return cachedKey; -} - -async function signToken(sub?: string): Promise { - const key = await getSigningKey(); - return new SignJWT({ iss: "fabro-web", ...(sub ? { sub } : {}) }) - .setProtectedHeader({ alg: "EdDSA" }) - .setIssuedAt() - .setExpirationTime("30s") - .sign(key); -} - -interface ApiOptions { - init?: RequestInit; - request?: Request; -} - -/** - * Fetch wrapper that signs requests with a JWT for service-to-service auth. - * When a request is provided, the authenticated user's URL is included as - * the JWT `sub` claim. - */ -export async function apiFetch( - path: string, - options?: ApiOptions -): Promise { - const { base_url } = getAppConfig().api; - const { init, request } = options ?? {}; - - let sub: string | undefined; - if (request) { - const user = await getUser(request); - sub = user?.userUrl; - } - - const headers = new Headers(init?.headers); - if (FABRO_JWT_PRIVATE_KEY) { - const token = await signToken(sub); - headers.set("Authorization", `Bearer ${token}`); - } - if (request && isDemoMode(request)) { - headers.set("X-Fabro-Demo", "1"); - } - - const url = `${base_url}${path}`; - try { - return await fetch(url, { ...init, headers }); - } catch (cause) { - throw new Error(`API request to ${url} failed`, { cause }); - } -} - -/** - * Typed JSON fetch helper. Calls apiFetch and parses the JSON response. - */ -export async function apiJson(path: string, options?: ApiOptions): Promise { - const res = await apiFetch(path, options); - if (!res.ok) throw new Response(null, { status: res.status }); - return res.json() as Promise; -} diff --git a/apps/fabro-web/app/api.ts b/apps/fabro-web/app/api.ts new file mode 100644 index 000000000..a212eb500 --- /dev/null +++ b/apps/fabro-web/app/api.ts @@ -0,0 +1,58 @@ +export interface ApiOptions { + init?: RequestInit; + request?: Request; +} + +export async function apiFetch(path: string, options?: ApiOptions): Promise { + const { init } = options ?? {}; + const response = await fetch(`/api/v1${path}`, { + ...init, + credentials: "include", + headers: init?.headers, + }); + + if (response.status === 401) { + window.location.href = "/auth/login"; + throw new Error("Unauthorized"); + } + + return response; +} + +export async function apiJson(path: string, options?: ApiOptions): Promise { + const response = await apiFetch(path, options); + if (!response.ok) { + throw new Response(null, { status: response.status, statusText: response.statusText }); + } + return response.json() as Promise; +} + +export async function getSetupStatus(): Promise<{ configured: boolean }> { + const response = await fetch("/api/v1/setup/status", { credentials: "include" }); + if (!response.ok) { + throw new Response(null, { status: response.status, statusText: response.statusText }); + } + return response.json(); +} + +export async function getAuthMe(): Promise<{ + user: { + login: string; + name: string; + email: string; + avatarUrl: string; + userUrl: string; + }; + provider: string; + demoMode: boolean; + features: { session_sandboxes: boolean; retros: boolean }; +}> { + const response = await fetch("/api/v1/auth/me", { credentials: "include" }); + if (response.status === 401) { + throw new Response(null, { status: 401, statusText: "Unauthorized" }); + } + if (!response.ok) { + throw new Response(null, { status: response.status, statusText: response.statusText }); + } + return response.json(); +} diff --git a/apps/fabro-web/app/entry.tsx b/apps/fabro-web/app/entry.tsx new file mode 100644 index 000000000..542dec68a --- /dev/null +++ b/apps/fabro-web/app/entry.tsx @@ -0,0 +1,17 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import { createBrowserRouter, RouterProvider } from "react-router"; +import { routes } from "./router"; + +const router = createBrowserRouter(routes); +const rootElement = document.getElementById("root"); + +if (!rootElement) { + throw new Error("Missing #root element"); +} + +createRoot(rootElement).render( + + + , +); diff --git a/apps/fabro-web/app/layouts/app-shell.tsx b/apps/fabro-web/app/layouts/app-shell.tsx index f926bcc29..5f9d250ed 100644 --- a/apps/fabro-web/app/layouts/app-shell.tsx +++ b/apps/fabro-web/app/layouts/app-shell.tsx @@ -12,55 +12,19 @@ import { BeakerIcon, ChartBarIcon, CheckBadgeIcon, - Cog6ToothIcon, LightBulbIcon, MoonIcon, PlayIcon, RectangleStackIcon, - SparklesIcon, SunIcon, XMarkIcon, } from "@heroicons/react/24/outline"; -import { Form, Link, Outlet, redirect, useLocation, useMatches } from "react-router"; +import { Form, Link, Outlet, redirect, useLocation, useMatches, useRevalidator } from "react-router"; +import { getAuthMe } from "../api"; import { useTheme } from "../lib/theme"; -import { getAppConfig } from "../lib/config.server"; -import { isDemoMode, demoCookieHeader } from "../lib/demo-mode.server"; -import { isGitHubAppConfigured } from "../lib/github.server"; -import { requireUser } from "../lib/session.server"; -import type { Route } from "./+types/app-shell"; -const DEMO_USER = { - userUrl: "", - login: "demo", - name: "Demo User", - email: "demo@example.com", - avatarUrl: "https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png", -}; - -export async function loader({ request }: Route.LoaderArgs) { - const config = getAppConfig(); - const { provider } = config.web.auth; - const demoMode = isDemoMode(request); - if (provider === "insecure_disabled") { - return { user: DEMO_USER, demoMode, features: config.features }; - } - if (provider === "github" && !isGitHubAppConfigured()) { - throw redirect("/setup"); - } - const user = await requireUser(request); - return { user, provider, demoMode, features: config.features }; -} - -export async function action({ request }: Route.ActionArgs) { - const form = await request.formData(); - if (form.get("intent") === "toggle-demo") { - const enabled = !isDemoMode(request); - const referer = request.headers.get("Referer") ?? "/start"; - const url = new URL(referer); - return redirect(url.pathname + url.search, { - headers: { "Set-Cookie": demoCookieHeader(enabled) }, - }); - } +export async function loader() { + return getAuthMe(); } const navigation = [ @@ -75,10 +39,11 @@ function classNames(...classes: Array) { return classes.filter(Boolean).join(" "); } -export default function AppShell({ loaderData }: Route.ComponentProps) { +export default function AppShell({ loaderData }: any) { const { user, provider, demoMode } = loaderData; const { pathname } = useLocation(); const matches = useMatches(); + const revalidator = useRevalidator(); const { theme, toggle } = useTheme(); const currentNav = navigation.find((item) => pathname.startsWith(item.href)); const title = currentNav?.name ?? ""; @@ -91,6 +56,16 @@ export default function AppShell({ loaderData }: Route.ComponentProps) { const ThemeIcon = theme === "dark" ? SunIcon : MoonIcon; + async function toggleDemoMode() { + await fetch("/api/v1/demo/toggle", { + method: "POST", + credentials: "include", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ enabled: !demoMode }), + }); + revalidator.revalidate(); + } + return (
@@ -128,20 +103,18 @@ export default function AppShell({ loaderData }: Route.ComponentProps) {
-
- - -
+ - {provider !== "tailscale" && ( - - - - Open user menu - - + + + + Open user menu + + - - -
- -
-
-
-
- )} + + +
+ +
+
+
+
@@ -240,20 +211,18 @@ export default function AppShell({ loaderData }: Route.ComponentProps) {
-
- - -
+