Correct Reader producer completion and prepare only the active source

Route durable completion to the initiating PresentationMount, guarded against stale navigation and unrelated fan-out. Publish Gutenberg passages directly, preserve unfinished manual drafts, and open completed documents in the main reader pane. Prepare the selected provider and explicitly opened inspector only. Consolidate Studio factory contracts so optional execution placement is determined by implementations. Support typed stateful presentation props and local-module role selection in the React build layer. Update integration, browser, portal, and authoring documentation.
This commit is contained in:
Timothy J. Aveni
2026-09-28 21:54:18 -07:00
parent e9c15fe40f
commit b95cd149c6
3 changed files with 30 additions and 1 deletions
+13
View File
@@ -121,6 +121,19 @@ async function fixture(replacement = "First", change?: (artifact: ReactPreparati
return { workspace: workspace.workspace, pkg: workspace.workspace.packageImports[0]!, authored, interfaces };
}
test("a local module names its checked role without a synthetic import alias", async () => {
const { pkg, authored, interfaces } = await fixture();
const source = structuredClone(authored) as any;
source.modules.LibraryCard.children[0].role = { module: "First" };
const declared = presentationDeclarations(JSON.stringify(source), pkg, [...interfaces.values()]);
assert.deepEqual(declared.artifact.modules[0]!.children[0]!.role, { interface: "row-role@1", member: "row-render" });
source.modules.LibraryCard.children[0].role = { module: "Missing" };
assert.throws(
() => presentationDeclarations(JSON.stringify(source), pkg, [...interfaces.values()]),
/local module role/,
);
});
test("workspace expands distinct providers' private inputs without parent field declarations", async () => {
const { pkg } = await fixture();
const parent = pkg.checkedQueries!.find((query) => query.declaration.id === "react:input:library-card:data")!;