workspace WebStudioFixture id "workspace:web-studio-fixture" revision "workspace:web-studio-fixture@1" commit "1111111111111111111111111111111111111111" { atom Project id "atom:project"; atom ProjectComponent id "atom:project-component"; interface ReactComponent id "interface:org.quixos.web-studio.react-component" revision "interface:org.quixos.web-studio.react-component@1" source { repository "https://repos.quixos.org/org-quixos-web-studio/interface-react-component.git"; commit "2222222222222222222222222222222222222222"; } { value props id "member:org.quixos.web-studio.react-component:props" : string { get id "operation:org.quixos.web-studio.react-component:props:get"; } } interface HasReactComponent id "interface:org.quixos.web-studio.has-react-component" revision "interface:org.quixos.web-studio.has-react-component@1" source { repository "https://repos.quixos.org/org-quixos-web-studio/interface-has-react-component.git"; commit "3333333333333333333333333333333333333333"; } { relation component id "member:org.quixos.web-studio.has-react-component:component" : optional-one interface ReactComponent { resolve id "operation:org.quixos.web-studio.has-react-component:component:resolve"; } } package ComponentRuntime id "package:component-runtime" revision "package:component-runtime@1" source { repository "https://repos.quixos.org/quixos-test/package-component-runtime.git"; commit "4444444444444444444444444444444444444444"; } { constructor createComponent id "export:component-runtime:create-component" constructs ProjectComponent : atom-ref; operation propsGet id "export:component-runtime:props-get" : unit -> string mode call receiver atom ProjectComponent requires { edge subject id "port:component:subject" : exactly-one atom Project [resolve]; state projectName id "port:component:project-name" : string [read]; }; } shared state ProjectName id "slot:project:name" on Project : string policy optimistic-register default "Untitled project"; shared edge ProjectComponentEdge id "edge:project:component" { atom ProjectComponent projection subject id "projection:component:subject" exactly-one; atom Project projection component id "projection:project:component" optional-one; } conform Project as HasReactComponent { bind component.resolve to edge ProjectComponentEdge.component.resolve; materialize component if absent using constructor ProjectComponent via edge ProjectComponentEdge.subject; } conform ProjectComponent as ReactComponent { bind props.get to package ComponentRuntime.propsGet with { subject to edge ProjectComponentEdge.subject; projectName to state ProjectName via edge ProjectComponentEdge.subject; }; } constructor ProjectComponent to ComponentRuntime.createComponent; }