feat: F6.1 FILIUS files on F: projects from examples and .fls, copies, export

/svc/examples lists FILIUS' examples, which lie beside F in the image (GPL
like this repository, kept out of the dashboard); /svc/projects makes a
project from one; /svc/projects/<id>/import takes a .fls (up to 64 MiB),
/copy copies a project as it is now, /export gives it back as a .fls with its
warnings. Large files go into the blob store on import and come back from it
on export, which is refused when one is missing.

Found on the way: Node's request body is a Buffer, and Yjs takes no Buffer
into a document, so every .fls with binary files would have failed; and
fflate, now in the bundle, imports createRequire itself, which the build's
banner declared again, so F did not start. The banner names it otherwise and
a test builds and starts the bundle. The proxy's /svc/ takes 70 MB.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-10 07:55:11 +00:00
co-authored by Claude Opus 5.5
parent 5fa590246c
commit fb1a467221
14 changed files with 503 additions and 26 deletions
+1 -1
View File
@@ -261,7 +261,7 @@ describe("the dashboard's service", () => {
it('makes an empty project once', async () => {
const server = await start();
const project = randomUUID();
expect(await answer(await service(server, 'POST', '/svc/projects', { project }))).toEqual([201, { project }]);
expect(await answer(await service(server, 'POST', '/svc/projects', { project }))).toEqual([201, { project, warnings: [] }]);
expect(await answer(await service(server, 'POST', '/svc/projects', { project }))).toEqual([409, { error: 'exists' }]);
const doc = new Y.Doc();
Y.applyUpdate(doc, (await store.load(project))!.state);