diff --git a/package.json b/package.json
index 31489906c..293a1fc51 100644
--- a/package.json
+++ b/package.json
@@ -56,7 +56,7 @@
"size": "cross-env SIZE=1 rollup -c ./rollup.config.js && node ./utilities/sizes.js",
"size:check": "cross-env CHECK=1 yarn size",
"size:write": "cross-env WRITE=1 yarn size && git add .sizes.json",
- "test": "cross-env MARKO_SOURCE_RUNTIME=1 TS_NODE_IGNORE='/node_modules/(?!@marko/)/' mocha --enable-source-maps -r ts-node/register --timeout 10000 packages/*/test/{*.test.ts,*/*.test.ts}",
+ "test": "cross-env MARKO_SOURCE_RUNTIME=1 TS_NODE_IGNORE='/node_modules/(?!@marko/)/' mocha --enable-source-maps -r ts-node/register --timeout 10000 packages/*/test/*.test.ts",
"test:coverage": "nyc --reporter=text-summary yarn test",
"test:watch": "yarn test --watch --watch-files '**/*.ts'"
},
diff --git a/packages/runtime/test/dom/main.test.ts b/packages/runtime/test/dom/main.test.ts
deleted file mode 100644
index 4280294db..000000000
--- a/packages/runtime/test/dom/main.test.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import fs from "fs";
-import path from "path";
-import snapshot from "../utils/snapshot";
-import renderAndTrackMutations from "./utils/render-and-track-mutations";
-
-const FIXTURES_DIR = path.join(__dirname, "./fixtures");
-
-process.on("unhandledRejection", (reason, p) => {
- console.log("Unhandled Rejection at: Promise", p, "reason:", reason);
-});
-
-describe("DOM", () => {
- fs.readdirSync(FIXTURES_DIR)
- .filter(entry => !/\.skip$/.test(entry))
- .map(entry => {
- const testDir = path.join(FIXTURES_DIR, entry);
- const testFile = path.join(testDir, "index.ts");
- it(entry, async () => {
- snapshot(
- testDir,
- "snapshot.md",
- await renderAndTrackMutations(entry, testFile)
- );
- });
- });
-});
diff --git a/packages/runtime/test/dom/utils/render-and-track-mutations.ts b/packages/runtime/test/dom/utils/render-and-track-mutations.ts
deleted file mode 100644
index c74fa941e..000000000
--- a/packages/runtime/test/dom/utils/render-and-track-mutations.ts
+++ /dev/null
@@ -1,114 +0,0 @@
-import createBrowser from "../../utils/create-browser";
-import createMutationTracker from "./track-mutations";
-import { wait, isWait } from "../../utils/resolve";
-
-const browser = createBrowser({
- dir: __dirname,
- html: ""
-});
-
-const window = browser.window;
-const document = window.document;
-
-const { createRenderFn, run } = browser.require(
- "../../../src/dom/index"
-) as typeof import("../../../src/dom/index");
-
-interface Test {
- wait?: number;
- inputs: [
- Record,
- ...Array<
- | Record
- | ((container: Element) => void)
- | ReturnType
- >
- ];
- default: ReturnType;
- html: string;
- FAILS_HYDRATE?: boolean;
-}
-
-export default async function renderAndGetMutations(
- id: string,
- test: string
-): Promise {
- const { default: render, inputs } = browser.require(test) as Test;
- const [firstInput] = inputs;
- const container = Object.assign(document.createElement("div"), {
- TEST_ROOT: true
- });
- const tracker = createMutationTracker(window, container);
-
- document.body.appendChild(container);
-
- try {
- tracker.beginUpdate();
-
- const instance = render(firstInput);
- container.appendChild(instance);
-
- // const initialHTML = container.innerHTML;
- tracker.logUpdate(firstInput);
-
- for (const update of inputs.slice(1)) {
- if (isWait(update)) {
- await update();
- } else {
- tracker.beginUpdate();
- if (typeof update === "function") {
- update(container);
- run();
- } else {
- instance.update(update);
- }
- tracker.logUpdate(update);
- }
- }
-
- // if (!FAILS_HYDRATE) {
- // const inputSignal = source(firstInput);
- // (window as any).M$c = [[0, id, dynamicKeys(inputSignal, renderer.input)]];
- // container.innerHTML = `${initialHTML}`;
- // container.insertBefore(document.createTextNode(""), container.firstChild);
- // tracker.dropUpdate();
- // init();
-
- // tracker.logUpdate(firstInput);
- // const logs = tracker.getRawLogs();
- // logs[logs.length - 1] = "--- Hydrate ---\n" + logs[logs.length - 1];
-
- // // Hydrate should end up with the same html as client side render.
- // assert.equal(container.innerHTML, initialHTML);
-
- // // Run the same updates after hydrate and ensure the same mutations.
- // let resultIndex = 0;
- // for (const update of inputs.slice(1)) {
- // if (wait) {
- // await resolveAfter(null, wait);
- // }
- // if (typeof update === "function") {
- // update(container);
- // } else {
- // const batch = beginBatch();
- // set(inputSignal, update);
- // endBatch(batch);
- // }
-
- // assert.equal(
- // tracker.getUpdate(update),
- // tracker.getRawLogs()[++resultIndex]
- // );
- // }
-
- // if (wait) {
- // await resolveAfter(null, wait);
- // }
- // }
-
- return tracker.getLogs();
- } finally {
- tracker.cleanup();
- document.body.removeChild(container);
- }
-}
diff --git a/packages/runtime/test/end-to-end/main.test.ts b/packages/runtime/test/end-to-end/main.test.ts
deleted file mode 100644
index 515a9fb78..000000000
--- a/packages/runtime/test/end-to-end/main.test.ts
+++ /dev/null
@@ -1,183 +0,0 @@
-import fs from "fs";
-import path from "path";
-import createBrowser from "../utils/create-browser";
-import { createRenderer } from "../../src/html/index";
-import reorderRuntime from "../../src/html/reorder-runtime";
-import { Writable } from "stream";
-import assert from "assert";
-import createTrackMutations from "../dom/utils/track-mutations";
-import snapshot from "../utils/snapshot";
-import { isWait } from "../utils/resolve";
-
-const FIXTURES_DIR = path.join(__dirname, "./fixtures");
-const runtimeId = "M";
-const reorderRuntimeString = String(reorderRuntime).replace(
- "RUNTIME_ID",
- runtimeId
-);
-
-describe("E2E", function () {
- this.timeout(10000);
- fs.readdirSync(FIXTURES_DIR)
- .filter(entry => !/\.skip$/.test(entry))
- .map(entry => {
- const testDir = path.join(FIXTURES_DIR, entry);
- const snapshotDir = path.join(testDir, "snapshots");
- const serverFile = path.join(testDir, "server.ts");
- const hydrateFile = path.join(testDir, "hydrate.ts");
- const browserFile = path.join(testDir, "browser.ts");
- const testFile = path.join(testDir, "test.ts");
- describe(entry, () => {
- let initialHTML: string;
- let hydratedHTML: string;
- it("server + hydrate", async () => {
- const serverTemplate = require(serverFile);
- const render = createRenderer(serverTemplate.default, true);
-
- let buffer = "";
- let flushCount = 0;
-
- const browser = createBrowser({ dir: __dirname });
- const test = browser.require(testFile);
- const hydrateIndex = test.hydrateFlush;
- const input = test.default[0];
-
- const document = browser.window.document;
-
- document.open();
-
- const tracker = createTrackMutations(browser.window, document);
-
- await render(input, {
- write(data: string) {
- buffer += data;
- tracker.log(
- `# Write\n${indent(
- data.replace(reorderRuntimeString, "REORDER_RUNTIME")
- )}`
- );
- },
- flush() {
- if (hydrateIndex === flushCount++) {
- browser.require(hydrateFile);
- tracker.logUpdate("Hydrate");
- }
- // document.write(buffer);
- // tracker.logUpdate("Flush");
- // buffer = "";
- },
- end(data?: string) {
- document.write(buffer + (data || ""));
- document.close();
- tracker.logUpdate("End");
- if (hydrateIndex == null) {
- browser.require(hydrateFile);
- tracker.logUpdate("Hydrate");
- }
- },
- emit(type, ...args: unknown[]) {
- tracker.log(
- `# Emit ${type}${args.map(arg => `\n${indent(arg)}`)}`
- );
- }
- } as Writable & { flush(): void });
-
- hydratedHTML = getNormalizedHtml(document.body);
-
- const { run } = browser.require(
- "../../src/dom/index"
- ) as typeof import("../../src/dom/index");
-
- for (const update of test.default) {
- if (isWait(update)) {
- await update();
- } else if (typeof update === "function") {
- update(document.documentElement);
- run();
- tracker.logUpdate(update);
- }
- }
-
- snapshot(snapshotDir, "server-hydrate.md", tracker.getLogs());
- });
- it("client only", async () => {
- const browser = createBrowser({ dir: __dirname });
- const document = browser.window.document;
- const test = browser.require(testFile);
- const input = test.default[0];
- const { run } = browser.require(
- "../../src/dom/index"
- ) as typeof import("../../src/dom/index");
- const render = browser.require(browserFile).default;
- const container = Object.assign(document.createElement("div"), {
- TEST_ROOT: true
- });
- const tracker = createTrackMutations(browser.window, container);
-
- document.body.appendChild(container);
-
- const instance = await render(input);
- container.appendChild(instance);
-
- initialHTML = getNormalizedHtml(container);
- tracker.logUpdate(input);
-
- for (const update of test.default) {
- if (isWait(update)) {
- await update();
- } else if (typeof update === "function") {
- update(document.documentElement);
- run();
- tracker.logUpdate(update);
- }
- }
-
- snapshot(snapshotDir, "client-only.md", tracker.getLogs());
- });
- it("hydrate = client", () => {
- assert.strictEqual(hydratedHTML, initialHTML);
- });
- });
- });
-});
-
-function indent(data: unknown) {
- return String(data)
- .split("\n")
- .map(line => ` ${line}`)
- .join("\n");
-}
-
-function getNormalizedHtml(container: Element) {
- const clone = container.cloneNode(true) as Element;
-
- const treeWalker = container.ownerDocument!.createTreeWalker(clone);
- const nodesToRemove: ChildNode[] = [];
-
- while (treeWalker.nextNode()) {
- const node = treeWalker.currentNode;
- if (node.nodeType === 8 || isIgnoredTag(node)) {
- nodesToRemove.push(node as ChildNode);
- } else if ((node as Element).tagName === "TEXTAREA") {
- node.textContent = (node as HTMLTextAreaElement).value;
- }
- }
-
- nodesToRemove.forEach(n => n.remove());
- // clone.innerHTML = clone.innerHTML;
- clone.normalize();
-
- return clone.innerHTML.trim();
-}
-
-function isIgnoredTag(node) {
- switch (node.tagName) {
- case "LINK":
- case "TITLE":
- case "STYLE":
- case "SCRIPT":
- return true;
- default:
- return false;
- }
-}
diff --git a/packages/runtime/test/html/fixtures/async-nested-resolve-in-order/index.ts b/packages/runtime/test/fixtures/async-nested-resolve-in-order/server.ts
similarity index 82%
rename from packages/runtime/test/html/fixtures/async-nested-resolve-in-order/index.ts
rename to packages/runtime/test/fixtures/async-nested-resolve-in-order/server.ts
index 15d01dc7c..efcbf8119 100644
--- a/packages/runtime/test/html/fixtures/async-nested-resolve-in-order/index.ts
+++ b/packages/runtime/test/fixtures/async-nested-resolve-in-order/server.ts
@@ -1,5 +1,5 @@
-import { write, fork } from "../../../../src/html/index";
-import { resolveAfter } from "../../../utils/resolve";
+import { write, fork } from "../../../src/html/index";
+import { resolveAfter } from "../../utils/resolve";
const renderer = () => {
write("a");
diff --git a/packages/runtime/test/fixtures/async-nested-resolve-in-order/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/async-nested-resolve-in-order/snapshots/server-hydrate.expected.md
new file mode 100644
index 000000000..35a3612ec
--- /dev/null
+++ b/packages/runtime/test/fixtures/async-nested-resolve-in-order/snapshots/server-hydrate.expected.md
@@ -0,0 +1,41 @@
+# Write
+ a
+
+
+# Write
+ b
+
+
+# Write
+ c
+
+
+# Write
+ defghi
+
+
+# Write
+ jkl
+
+
+# Render "End"
+```html
+
+
+
+
+ abcdefghijkl
+
+
+
+```
+
+# Mutations
+```
+inserted #document/#comment0
+inserted #document/html1
+inserted #document/html1/head0
+inserted #document/html1/body1
+inserted #document/html1/body1/#text0
+inserted #document/html1/body1/#comment1
+```
\ No newline at end of file
diff --git a/packages/runtime/test/fixtures/async-nested-resolve-in-order/test.ts b/packages/runtime/test/fixtures/async-nested-resolve-in-order/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/async-nested-resolve-in-order/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/html/fixtures/async-resolve-in-order/index.ts b/packages/runtime/test/fixtures/async-resolve-in-order/server.ts
similarity index 60%
rename from packages/runtime/test/html/fixtures/async-resolve-in-order/index.ts
rename to packages/runtime/test/fixtures/async-resolve-in-order/server.ts
index b1019b6e8..59d235397 100644
--- a/packages/runtime/test/html/fixtures/async-resolve-in-order/index.ts
+++ b/packages/runtime/test/fixtures/async-resolve-in-order/server.ts
@@ -1,5 +1,5 @@
-import { write, fork } from "../../../../src/html/index";
-import { resolveAfter } from "../../../utils/resolve";
+import { write, fork } from "../../../src/html/index";
+import { resolveAfter } from "../../utils/resolve";
const renderer = () => {
write("a");
diff --git a/packages/runtime/test/fixtures/async-resolve-in-order/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/async-resolve-in-order/snapshots/server-hydrate.expected.md
new file mode 100644
index 000000000..e9a6cc2f8
--- /dev/null
+++ b/packages/runtime/test/fixtures/async-resolve-in-order/snapshots/server-hydrate.expected.md
@@ -0,0 +1,33 @@
+# Write
+ a
+
+
+# Write
+ bc
+
+
+# Write
+ de
+
+
+# Render "End"
+```html
+
+
+
+
+ abcde
+
+
+
+```
+
+# Mutations
+```
+inserted #document/#comment0
+inserted #document/html1
+inserted #document/html1/head0
+inserted #document/html1/body1
+inserted #document/html1/body1/#text0
+inserted #document/html1/body1/#comment1
+```
\ No newline at end of file
diff --git a/packages/runtime/test/fixtures/async-resolve-in-order/test.ts b/packages/runtime/test/fixtures/async-resolve-in-order/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/async-resolve-in-order/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/html/fixtures/async-resolve-out-of-order/index.ts b/packages/runtime/test/fixtures/async-resolve-out-of-order/server.ts
similarity index 60%
rename from packages/runtime/test/html/fixtures/async-resolve-out-of-order/index.ts
rename to packages/runtime/test/fixtures/async-resolve-out-of-order/server.ts
index 21c305141..fd89e7bff 100644
--- a/packages/runtime/test/html/fixtures/async-resolve-out-of-order/index.ts
+++ b/packages/runtime/test/fixtures/async-resolve-out-of-order/server.ts
@@ -1,5 +1,5 @@
-import { write, fork } from "../../../../src/html/index";
-import { resolveAfter } from "../../../utils/resolve";
+import { write, fork } from "../../../src/html/index";
+import { resolveAfter } from "../../utils/resolve";
const renderer = () => {
write("a");
diff --git a/packages/runtime/test/fixtures/async-resolve-out-of-order/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/async-resolve-out-of-order/snapshots/server-hydrate.expected.md
new file mode 100644
index 000000000..b5f1a16e7
--- /dev/null
+++ b/packages/runtime/test/fixtures/async-resolve-out-of-order/snapshots/server-hydrate.expected.md
@@ -0,0 +1,29 @@
+# Write
+ a
+
+
+# Write
+ bcde
+
+
+# Render "End"
+```html
+
+
+
+
+ abcde
+
+
+
+```
+
+# Mutations
+```
+inserted #document/#comment0
+inserted #document/html1
+inserted #document/html1/head0
+inserted #document/html1/body1
+inserted #document/html1/body1/#text0
+inserted #document/html1/body1/#comment1
+```
\ No newline at end of file
diff --git a/packages/runtime/test/fixtures/async-resolve-out-of-order/test.ts b/packages/runtime/test/fixtures/async-resolve-out-of-order/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/async-resolve-out-of-order/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/end-to-end/fixtures/basic-counter/browser.ts b/packages/runtime/test/fixtures/basic-counter/browser.ts
similarity index 64%
rename from packages/runtime/test/end-to-end/fixtures/basic-counter/browser.ts
rename to packages/runtime/test/fixtures/basic-counter/browser.ts
index 289bb2302..25df66d8a 100644
--- a/packages/runtime/test/end-to-end/fixtures/basic-counter/browser.ts
+++ b/packages/runtime/test/fixtures/basic-counter/browser.ts
@@ -7,8 +7,8 @@ import {
queue,
write,
bind
-} from "../../../../src/dom/index";
-import { get, next, open, close } from "../../../dom/utils/walks";
+} from "../../../src/dom/index";
+import { get, next, open, close } from "../../utils/walks";
const enum Index {
BUTTON = 0,
@@ -28,8 +28,7 @@ type scope = {
export const template = ``;
export const walks = open(3) + get + next(1) + get + next(1) + close;
export const render = () => {
- write(Index.CLICK_COUNT, 0);
- renderClickCount();
+ renderClickCount(0);
hydrate();
};
@@ -37,19 +36,18 @@ export const hydrate = () => {
on(Index.BUTTON, "click", bind(clickHandler));
};
-const renderClickCount = () => {
- data(Index.BUTTON_TEXT, read(Index.CLICK_COUNT));
+const renderClickCount = value => {
+ if (write(Index.CLICK_COUNT, value)) {
+ data(Index.BUTTON_TEXT, value);
+ }
};
const clickHandler = () => {
- if (
- write(
- Index.CLICK_COUNT,
- read(Index.CLICK_COUNT) + 1
- )
- ) {
- queue(renderClickCount);
- }
+ queue(
+ renderClickCount,
+ Index.CLICK_COUNT,
+ read(Index.CLICK_COUNT) + 1
+ );
};
export default createRenderFn(template, walks, render, 0);
diff --git a/packages/runtime/test/end-to-end/fixtures/basic-counter/hydrate.ts b/packages/runtime/test/fixtures/basic-counter/hydrate.ts
similarity index 55%
rename from packages/runtime/test/end-to-end/fixtures/basic-counter/hydrate.ts
rename to packages/runtime/test/fixtures/basic-counter/hydrate.ts
index 59deb700e..f024cc119 100644
--- a/packages/runtime/test/end-to-end/fixtures/basic-counter/hydrate.ts
+++ b/packages/runtime/test/fixtures/basic-counter/hydrate.ts
@@ -1,4 +1,4 @@
-import { init, register } from "../../../../src/dom/index";
+import { init, register } from "../../../src/dom/index";
import { hydrate } from "./browser";
register("counter", hydrate);
diff --git a/packages/runtime/test/end-to-end/fixtures/basic-counter/server.ts b/packages/runtime/test/fixtures/basic-counter/server.ts
similarity index 90%
rename from packages/runtime/test/end-to-end/fixtures/basic-counter/server.ts
rename to packages/runtime/test/fixtures/basic-counter/server.ts
index a5bff1b12..c6278d7db 100644
--- a/packages/runtime/test/end-to-end/fixtures/basic-counter/server.ts
+++ b/packages/runtime/test/fixtures/basic-counter/server.ts
@@ -1,5 +1,5 @@
-import { Scope } from "../../../../src/common/types";
-import { write, markScopeOffset, hydrateFunction } from "../../../../src/html";
+import { Scope } from "../../../src/common/types";
+import { write, markScopeOffset, hydrateFunction } from "../../../src/html";
export default (
_input: unknown,
diff --git a/packages/runtime/test/end-to-end/fixtures/basic-counter/snapshots/client-only.expected.md b/packages/runtime/test/fixtures/basic-counter/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/end-to-end/fixtures/basic-counter/snapshots/client-only.expected.md
rename to packages/runtime/test/fixtures/basic-counter/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/end-to-end/fixtures/basic-counter/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/basic-counter/snapshots/server-hydrate.expected.md
similarity index 100%
rename from packages/runtime/test/end-to-end/fixtures/basic-counter/snapshots/server-hydrate.expected.md
rename to packages/runtime/test/fixtures/basic-counter/snapshots/server-hydrate.expected.md
diff --git a/packages/runtime/test/end-to-end/fixtures/basic-counter/test.ts b/packages/runtime/test/fixtures/basic-counter/test.ts
similarity index 100%
rename from packages/runtime/test/end-to-end/fixtures/basic-counter/test.ts
rename to packages/runtime/test/fixtures/basic-counter/test.ts
diff --git a/packages/runtime/test/dom/fixtures/batched-updates-cleanup/index.ts b/packages/runtime/test/fixtures/batched-updates-cleanup/browser.ts
similarity index 98%
rename from packages/runtime/test/dom/fixtures/batched-updates-cleanup/index.ts
rename to packages/runtime/test/fixtures/batched-updates-cleanup/browser.ts
index f499a6130..1991ab6a9 100644
--- a/packages/runtime/test/dom/fixtures/batched-updates-cleanup/index.ts
+++ b/packages/runtime/test/fixtures/batched-updates-cleanup/browser.ts
@@ -12,7 +12,7 @@ import {
bind,
readInOwner,
queueInBranch
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { get, next, over, open, close } from "../../utils/walks";
diff --git a/packages/runtime/test/dom/fixtures/batched-updates-cleanup/snapshot.expected.md b/packages/runtime/test/fixtures/batched-updates-cleanup/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/batched-updates-cleanup/snapshot.expected.md
rename to packages/runtime/test/fixtures/batched-updates-cleanup/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/batched-updates-cleanup/test.ts b/packages/runtime/test/fixtures/batched-updates-cleanup/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/batched-updates-cleanup/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/batched-updates/index.ts b/packages/runtime/test/fixtures/batched-updates/browser.ts
similarity index 97%
rename from packages/runtime/test/dom/fixtures/batched-updates/index.ts
rename to packages/runtime/test/fixtures/batched-updates/browser.ts
index 23512d73f..c3fa8c6c1 100644
--- a/packages/runtime/test/dom/fixtures/batched-updates/index.ts
+++ b/packages/runtime/test/fixtures/batched-updates/browser.ts
@@ -8,7 +8,7 @@ import {
bind,
read,
write
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { get, next, open, close } from "../../utils/walks";
const click = (container: Element) => {
diff --git a/packages/runtime/test/dom/fixtures/batched-updates/snapshot.expected.md b/packages/runtime/test/fixtures/batched-updates/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/batched-updates/snapshot.expected.md
rename to packages/runtime/test/fixtures/batched-updates/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/batched-updates/test.ts b/packages/runtime/test/fixtures/batched-updates/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/batched-updates/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/html/fixtures/catch-single-reject-async/index.ts b/packages/runtime/test/fixtures/catch-single-reject-async/server.ts
similarity index 69%
rename from packages/runtime/test/html/fixtures/catch-single-reject-async/index.ts
rename to packages/runtime/test/fixtures/catch-single-reject-async/server.ts
index b1eaeab5d..296afc035 100644
--- a/packages/runtime/test/html/fixtures/catch-single-reject-async/index.ts
+++ b/packages/runtime/test/fixtures/catch-single-reject-async/server.ts
@@ -1,5 +1,5 @@
-import { tryCatch, write, fork } from "../../../../src/html/index";
-import { resolveAfter, rejectAfter } from "../../../utils/resolve";
+import { tryCatch, write, fork } from "../../../src/html/index";
+import { resolveAfter, rejectAfter } from "../../utils/resolve";
const renderer = () => {
write("a");
diff --git a/packages/runtime/test/fixtures/catch-single-reject-async/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/catch-single-reject-async/snapshots/server-hydrate.expected.md
new file mode 100644
index 000000000..de6ec5aca
--- /dev/null
+++ b/packages/runtime/test/fixtures/catch-single-reject-async/snapshots/server-hydrate.expected.md
@@ -0,0 +1,48 @@
+# Write
+ ab
+
+
+# Write
+ defg
+
+
+# Write
+ ERROR!
+
+
+# Render "End"
+```html
+
+
+
+
+ aERROR!efg
+
+
+
+```
+
+# Mutations
+```
+inserted #document/#comment0
+inserted #document/html1
+inserted #document/html1/head0
+inserted #document/html1/body1
+inserted #document/html1/body1/#text0
+inserted #comment
+inserted #text
+inserted #comment
+inserted #document/html1/body1/#text2
+inserted #document/html1/body1/#comment3
+inserted t
+inserted #document/html1/body1/#text1
+inserted script
+inserted script/#text0
+removed #document/html1/body1/#text1 in t
+inserted #document/html1/body1/#text1
+removed script after t
+removed t after #document/html1/body1/#comment3
+removed #comment after #document/html1/body1/#text1
+removed #text after #document/html1/body1/#text1
+removed #comment after #document/html1/body1/#text1
+```
\ No newline at end of file
diff --git a/packages/runtime/test/fixtures/catch-single-reject-async/test.ts b/packages/runtime/test/fixtures/catch-single-reject-async/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/catch-single-reject-async/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/html/fixtures/catch-single-success-async/index.ts b/packages/runtime/test/fixtures/catch-single-success-async/server.ts
similarity index 70%
rename from packages/runtime/test/html/fixtures/catch-single-success-async/index.ts
rename to packages/runtime/test/fixtures/catch-single-success-async/server.ts
index 1c78d2953..aa0a6f273 100644
--- a/packages/runtime/test/html/fixtures/catch-single-success-async/index.ts
+++ b/packages/runtime/test/fixtures/catch-single-success-async/server.ts
@@ -1,5 +1,5 @@
-import { tryCatch, write, fork } from "../../../../src/html/index";
-import { resolveAfter } from "../../../utils/resolve";
+import { tryCatch, write, fork } from "../../../src/html/index";
+import { resolveAfter } from "../../utils/resolve";
const renderer = () => {
write("a");
diff --git a/packages/runtime/test/fixtures/catch-single-success-async/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/catch-single-success-async/snapshots/server-hydrate.expected.md
new file mode 100644
index 000000000..8d9a2ea1b
--- /dev/null
+++ b/packages/runtime/test/fixtures/catch-single-success-async/snapshots/server-hydrate.expected.md
@@ -0,0 +1,37 @@
+# Write
+ ab
+
+
+# Write
+ cdfgh
+
+
+# Render "End"
+```html
+
+
+
+
+ a
+
+ bcd
+
+ fgh
+
+
+
+```
+
+# Mutations
+```
+inserted #document/#comment0
+inserted #document/html1
+inserted #document/html1/head0
+inserted #document/html1/body1
+inserted #document/html1/body1/#text0
+inserted #document/html1/body1/#comment1
+inserted #document/html1/body1/#text2
+inserted #document/html1/body1/#comment3
+inserted #document/html1/body1/#text4
+inserted #document/html1/body1/#comment5
+```
\ No newline at end of file
diff --git a/packages/runtime/test/fixtures/catch-single-success-async/test.ts b/packages/runtime/test/fixtures/catch-single-success-async/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/catch-single-success-async/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/html/fixtures/catch-single-success-sync/index.ts b/packages/runtime/test/fixtures/catch-single-success-sync/server.ts
similarity index 74%
rename from packages/runtime/test/html/fixtures/catch-single-success-sync/index.ts
rename to packages/runtime/test/fixtures/catch-single-success-sync/server.ts
index b882c37b3..0dabfef8a 100644
--- a/packages/runtime/test/html/fixtures/catch-single-success-sync/index.ts
+++ b/packages/runtime/test/fixtures/catch-single-success-sync/server.ts
@@ -1,4 +1,4 @@
-import { tryCatch, write } from "../../../../src/html/index";
+import { tryCatch, write } from "../../../src/html/index";
const renderer = () => {
write("a");
diff --git a/packages/runtime/test/fixtures/catch-single-success-sync/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/catch-single-success-sync/snapshots/server-hydrate.expected.md
new file mode 100644
index 000000000..ea347cbe1
--- /dev/null
+++ b/packages/runtime/test/fixtures/catch-single-success-sync/snapshots/server-hydrate.expected.md
@@ -0,0 +1,25 @@
+# Write
+ abc
+
+
+# Render "End"
+```html
+
+
+
+
+ abc
+
+
+
+```
+
+# Mutations
+```
+inserted #document/#comment0
+inserted #document/html1
+inserted #document/html1/head0
+inserted #document/html1/body1
+inserted #document/html1/body1/#text0
+inserted #document/html1/body1/#comment1
+```
\ No newline at end of file
diff --git a/packages/runtime/test/fixtures/catch-single-success-sync/test.ts b/packages/runtime/test/fixtures/catch-single-success-sync/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/catch-single-success-sync/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/html/fixtures/catch-single-throw-sync/index.ts b/packages/runtime/test/fixtures/catch-single-throw-sync/server.ts
similarity index 78%
rename from packages/runtime/test/html/fixtures/catch-single-throw-sync/index.ts
rename to packages/runtime/test/fixtures/catch-single-throw-sync/server.ts
index 8d0ec4b2e..3104d8c5c 100644
--- a/packages/runtime/test/html/fixtures/catch-single-throw-sync/index.ts
+++ b/packages/runtime/test/fixtures/catch-single-throw-sync/server.ts
@@ -1,4 +1,4 @@
-import { tryCatch, write } from "../../../../src/html/index";
+import { tryCatch, write } from "../../../src/html/index";
const renderer = () => {
write("a");
diff --git a/packages/runtime/test/fixtures/catch-single-throw-sync/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/catch-single-throw-sync/snapshots/server-hydrate.expected.md
new file mode 100644
index 000000000..18b996b13
--- /dev/null
+++ b/packages/runtime/test/fixtures/catch-single-throw-sync/snapshots/server-hydrate.expected.md
@@ -0,0 +1,25 @@
+# Write
+ aERROR!d
+
+
+# Render "End"
+```html
+
+
+
+
+ aERROR!d
+
+
+
+```
+
+# Mutations
+```
+inserted #document/#comment0
+inserted #document/html1
+inserted #document/html1/head0
+inserted #document/html1/body1
+inserted #document/html1/body1/#text0
+inserted #document/html1/body1/#comment1
+```
\ No newline at end of file
diff --git a/packages/runtime/test/fixtures/catch-single-throw-sync/test.ts b/packages/runtime/test/fixtures/catch-single-throw-sync/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/catch-single-throw-sync/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/fixtures/component-markers-async.skip/server.ts b/packages/runtime/test/fixtures/component-markers-async.skip/server.ts
new file mode 100644
index 000000000..d5fd08f3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/component-markers-async.skip/server.ts
@@ -0,0 +1,21 @@
+import { write, fork } from "../../../src/html/index";
+import { resolveAfter } from "../../utils/resolve";
+
+const renderer = () => {
+ firstComponent();
+ secondComponent();
+};
+
+const firstComponent = () => {
+ write("x");
+ write("y");
+ write("z");
+};
+
+const secondComponent = () => {
+ write("a");
+ fork(resolveAfter("b", 1), write);
+ fork(resolveAfter("c", 2), write);
+};
+
+export default renderer;
diff --git a/packages/runtime/test/html/fixtures/component-markers-async.skip/snapshot.expected.md b/packages/runtime/test/fixtures/component-markers-async.skip/snapshots/server-hydrate.expected.md
similarity index 100%
rename from packages/runtime/test/html/fixtures/component-markers-async.skip/snapshot.expected.md
rename to packages/runtime/test/fixtures/component-markers-async.skip/snapshots/server-hydrate.expected.md
diff --git a/packages/runtime/test/fixtures/component-markers-async.skip/test.ts b/packages/runtime/test/fixtures/component-markers-async.skip/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/component-markers-async.skip/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/html/fixtures/component-markers-placeholder.skip/index.ts b/packages/runtime/test/fixtures/component-markers-placeholder.skip/server.ts
similarity index 81%
rename from packages/runtime/test/html/fixtures/component-markers-placeholder.skip/index.ts
rename to packages/runtime/test/fixtures/component-markers-placeholder.skip/server.ts
index 5e35a5839..5cf95b5d1 100644
--- a/packages/runtime/test/html/fixtures/component-markers-placeholder.skip/index.ts
+++ b/packages/runtime/test/fixtures/component-markers-placeholder.skip/server.ts
@@ -1,10 +1,5 @@
-import {
- write,
- fork,
- tryPlaceholder,
- register
-} from "../../../../src/html/index";
-import { resolveAfter } from "../../../utils/resolve";
+import { write, fork, tryPlaceholder } from "../../../src/html/index";
+import { resolveAfter } from "../../utils/resolve";
const renderer = () => {
firstComponent({});
diff --git a/packages/runtime/test/html/fixtures/component-markers-placeholder.skip/snapshot.expected.md b/packages/runtime/test/fixtures/component-markers-placeholder.skip/snapshots/server-hydrate.expected.md
similarity index 100%
rename from packages/runtime/test/html/fixtures/component-markers-placeholder.skip/snapshot.expected.md
rename to packages/runtime/test/fixtures/component-markers-placeholder.skip/snapshots/server-hydrate.expected.md
diff --git a/packages/runtime/test/fixtures/component-markers-placeholder.skip/test.ts b/packages/runtime/test/fixtures/component-markers-placeholder.skip/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/component-markers-placeholder.skip/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/html/fixtures/component-markers-sibling-forks.skip/index.ts b/packages/runtime/test/fixtures/component-markers-sibling-forks.skip/server.ts
similarity index 76%
rename from packages/runtime/test/html/fixtures/component-markers-sibling-forks.skip/index.ts
rename to packages/runtime/test/fixtures/component-markers-sibling-forks.skip/server.ts
index 3bcebfe84..4ed5ce205 100644
--- a/packages/runtime/test/html/fixtures/component-markers-sibling-forks.skip/index.ts
+++ b/packages/runtime/test/fixtures/component-markers-sibling-forks.skip/server.ts
@@ -1,5 +1,5 @@
-import { write, fork, register } from "../../../../src/html/index";
-import { resolveAfter } from "../../../utils/resolve";
+import { write, fork, register } from "../../../src/html/index";
+import { resolveAfter } from "../../utils/resolve";
const renderer = () => {
firstComponent({});
diff --git a/packages/runtime/test/html/fixtures/component-markers-sibling-forks.skip/snapshot.expected.md b/packages/runtime/test/fixtures/component-markers-sibling-forks.skip/snapshots/server-hydrate.expected.md
similarity index 100%
rename from packages/runtime/test/html/fixtures/component-markers-sibling-forks.skip/snapshot.expected.md
rename to packages/runtime/test/fixtures/component-markers-sibling-forks.skip/snapshots/server-hydrate.expected.md
diff --git a/packages/runtime/test/fixtures/component-markers-sibling-forks.skip/test.ts b/packages/runtime/test/fixtures/component-markers-sibling-forks.skip/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/component-markers-sibling-forks.skip/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/html/fixtures/component-markers-sync.skip/index.ts b/packages/runtime/test/fixtures/component-markers-sync.skip/server.ts
similarity index 85%
rename from packages/runtime/test/html/fixtures/component-markers-sync.skip/index.ts
rename to packages/runtime/test/fixtures/component-markers-sync.skip/server.ts
index 29fcb9f06..80a5b89db 100644
--- a/packages/runtime/test/html/fixtures/component-markers-sync.skip/index.ts
+++ b/packages/runtime/test/fixtures/component-markers-sync.skip/server.ts
@@ -1,4 +1,4 @@
-import { write, register } from "../../../../src/html/index";
+import { write } from "../../../src/html/index";
const renderer = () => {
firstComponent({});
diff --git a/packages/runtime/test/html/fixtures/component-markers-sync.skip/snapshot.expected.md b/packages/runtime/test/fixtures/component-markers-sync.skip/snapshots/server-hydrate.expected.md
similarity index 100%
rename from packages/runtime/test/html/fixtures/component-markers-sync.skip/snapshot.expected.md
rename to packages/runtime/test/fixtures/component-markers-sync.skip/snapshots/server-hydrate.expected.md
diff --git a/packages/runtime/test/fixtures/component-markers-sync.skip/test.ts b/packages/runtime/test/fixtures/component-markers-sync.skip/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/component-markers-sync.skip/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/dom/fixtures/create-and-clear-rows-loop-from/index.ts b/packages/runtime/test/fixtures/create-and-clear-rows-loop-from/browser.ts
similarity index 97%
rename from packages/runtime/test/dom/fixtures/create-and-clear-rows-loop-from/index.ts
rename to packages/runtime/test/fixtures/create-and-clear-rows-loop-from/browser.ts
index 1147cba55..350fd136b 100644
--- a/packages/runtime/test/dom/fixtures/create-and-clear-rows-loop-from/index.ts
+++ b/packages/runtime/test/fixtures/create-and-clear-rows-loop-from/browser.ts
@@ -5,7 +5,7 @@ import {
createRenderFn,
write,
read
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { over, get, next, open, close, skip } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/create-and-clear-rows-loop-from/snapshot.expected.md b/packages/runtime/test/fixtures/create-and-clear-rows-loop-from/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/create-and-clear-rows-loop-from/snapshot.expected.md
rename to packages/runtime/test/fixtures/create-and-clear-rows-loop-from/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/create-and-clear-rows-loop-from/test.ts b/packages/runtime/test/fixtures/create-and-clear-rows-loop-from/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/create-and-clear-rows-loop-from/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/create-and-clear-rows-loop-in/index.ts b/packages/runtime/test/fixtures/create-and-clear-rows-loop-in/browser.ts
similarity index 98%
rename from packages/runtime/test/dom/fixtures/create-and-clear-rows-loop-in/index.ts
rename to packages/runtime/test/fixtures/create-and-clear-rows-loop-in/browser.ts
index 8a5a676be..26bcb2884 100644
--- a/packages/runtime/test/dom/fixtures/create-and-clear-rows-loop-in/index.ts
+++ b/packages/runtime/test/fixtures/create-and-clear-rows-loop-in/browser.ts
@@ -5,7 +5,7 @@ import {
setLoopIn,
createRenderer,
createRenderFn
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { over, get, next, open, close, skip } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/create-and-clear-rows-loop-in/snapshot.expected.md b/packages/runtime/test/fixtures/create-and-clear-rows-loop-in/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/create-and-clear-rows-loop-in/snapshot.expected.md
rename to packages/runtime/test/fixtures/create-and-clear-rows-loop-in/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/create-and-clear-rows-loop-in/test.ts b/packages/runtime/test/fixtures/create-and-clear-rows-loop-in/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/create-and-clear-rows-loop-in/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/create-and-clear-rows/index.ts b/packages/runtime/test/fixtures/create-and-clear-rows/browser.ts
similarity index 98%
rename from packages/runtime/test/dom/fixtures/create-and-clear-rows/index.ts
rename to packages/runtime/test/fixtures/create-and-clear-rows/browser.ts
index df6e0246b..8e76dc51e 100644
--- a/packages/runtime/test/dom/fixtures/create-and-clear-rows/index.ts
+++ b/packages/runtime/test/fixtures/create-and-clear-rows/browser.ts
@@ -5,7 +5,7 @@ import {
setLoopOf,
createRenderer,
createRenderFn
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { next, over, get, open, close, skip } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/create-and-clear-rows/snapshot.expected.md b/packages/runtime/test/fixtures/create-and-clear-rows/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/create-and-clear-rows/snapshot.expected.md
rename to packages/runtime/test/fixtures/create-and-clear-rows/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/create-and-clear-rows/test.ts b/packages/runtime/test/fixtures/create-and-clear-rows/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/create-and-clear-rows/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/dynamic-tag.skip/index.ts b/packages/runtime/test/fixtures/dynamic-tag.skip/browser.ts
similarity index 100%
rename from packages/runtime/test/dom/fixtures/dynamic-tag.skip/index.ts
rename to packages/runtime/test/fixtures/dynamic-tag.skip/browser.ts
diff --git a/packages/runtime/test/dom/fixtures/dynamic-tag.skip/snapshot.expected.md b/packages/runtime/test/fixtures/dynamic-tag.skip/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/dynamic-tag.skip/snapshot.expected.md
rename to packages/runtime/test/fixtures/dynamic-tag.skip/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/dynamic-tag.skip/test.ts b/packages/runtime/test/fixtures/dynamic-tag.skip/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/dynamic-tag.skip/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/html/fixtures/error-async/index.ts b/packages/runtime/test/fixtures/error-async/server.ts
similarity index 54%
rename from packages/runtime/test/html/fixtures/error-async/index.ts
rename to packages/runtime/test/fixtures/error-async/server.ts
index e4485f211..ffb9603f3 100644
--- a/packages/runtime/test/html/fixtures/error-async/index.ts
+++ b/packages/runtime/test/fixtures/error-async/server.ts
@@ -1,5 +1,5 @@
-import { write, fork } from "../../../../src/html/index";
-import { rejectAfter } from "../../../utils/resolve";
+import { write, fork } from "../../../src/html/index";
+import { rejectAfter } from "../../utils/resolve";
const renderer = () => {
write("a");
diff --git a/packages/runtime/test/fixtures/error-async/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/error-async/snapshots/server-hydrate.expected.md
new file mode 100644
index 000000000..09e91304a
--- /dev/null
+++ b/packages/runtime/test/fixtures/error-async/snapshots/server-hydrate.expected.md
@@ -0,0 +1,33 @@
+# Write
+ a
+
+
+# Write
+ b
+
+
+# Emit error
+ Error: ERROR!
+
+
+# Render "End"
+```html
+
+
+
+
+ ab
+
+
+
+```
+
+# Mutations
+```
+inserted #document/#comment0
+inserted #document/html1
+inserted #document/html1/head0
+inserted #document/html1/body1
+inserted #document/html1/body1/#text0
+inserted #document/html1/body1/#comment1
+```
\ No newline at end of file
diff --git a/packages/runtime/test/fixtures/error-async/test.ts b/packages/runtime/test/fixtures/error-async/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/error-async/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/html/fixtures/error-sync/index.ts b/packages/runtime/test/fixtures/error-sync/server.ts
similarity index 68%
rename from packages/runtime/test/html/fixtures/error-sync/index.ts
rename to packages/runtime/test/fixtures/error-sync/server.ts
index d8fbb7669..7f1d71956 100644
--- a/packages/runtime/test/html/fixtures/error-sync/index.ts
+++ b/packages/runtime/test/fixtures/error-sync/server.ts
@@ -1,4 +1,4 @@
-import { write } from "../../../../src/html/index";
+import { write } from "../../../src/html/index";
const renderer = () => {
write("a");
diff --git a/packages/runtime/test/fixtures/error-sync/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/error-sync/snapshots/server-hydrate.expected.md
new file mode 100644
index 000000000..c5cc551d8
--- /dev/null
+++ b/packages/runtime/test/fixtures/error-sync/snapshots/server-hydrate.expected.md
@@ -0,0 +1,27 @@
+# Write
+ a
+
+
+# Emit error
+ Error: ERROR!
+
+
+# Render "End"
+```html
+
+
+
+ a
+
+
+```
+
+# Mutations
+```
+inserted #document/#comment0
+inserted #document/html1
+inserted #document/html1/head0
+inserted #document/html1/body1
+inserted #document/html1/body1/#text0
+```
\ No newline at end of file
diff --git a/packages/runtime/test/fixtures/error-sync/test.ts b/packages/runtime/test/fixtures/error-sync/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/error-sync/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/dom/fixtures/event-handler-read-mutation.skip/index.ts b/packages/runtime/test/fixtures/event-handler-read-mutation.skip/browser.ts
similarity index 100%
rename from packages/runtime/test/dom/fixtures/event-handler-read-mutation.skip/index.ts
rename to packages/runtime/test/fixtures/event-handler-read-mutation.skip/browser.ts
diff --git a/packages/runtime/test/dom/fixtures/event-handler-read-mutation.skip/snapshot.expected.md b/packages/runtime/test/fixtures/event-handler-read-mutation.skip/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/event-handler-read-mutation.skip/snapshot.expected.md
rename to packages/runtime/test/fixtures/event-handler-read-mutation.skip/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/event-handler-read-mutation.skip/test.ts b/packages/runtime/test/fixtures/event-handler-read-mutation.skip/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/event-handler-read-mutation.skip/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/event-handlers/index.ts b/packages/runtime/test/fixtures/event-handlers/browser.ts
similarity index 56%
rename from packages/runtime/test/dom/fixtures/event-handlers/index.ts
rename to packages/runtime/test/fixtures/event-handlers/browser.ts
index e27adedca..4a1b4698d 100644
--- a/packages/runtime/test/dom/fixtures/event-handlers/index.ts
+++ b/packages/runtime/test/fixtures/event-handlers/browser.ts
@@ -1,6 +1,5 @@
import {
data,
- register,
createRenderFn,
on,
read,
@@ -8,7 +7,7 @@ import {
queue,
write,
bind
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { get, next, open, close } from "../../utils/walks";
const click = (container: Element) => {
@@ -20,13 +19,15 @@ export const inputs = [{}, click, click, click] as const;
const enum Index {
BUTTON = 0,
BUTTON_TEXT = 1,
- CLICK_COUNT = 2
+ CLICK_COUNT = 2,
+ EVENT_HANDLER = 3
}
type scope = {
[Index.BUTTON]: HTMLButtonElement;
[Index.BUTTON_TEXT]: Text;
[Index.CLICK_COUNT]: number;
+ [Index.EVENT_HANDLER]: false | (() => void);
};
//
@@ -35,43 +36,36 @@ type scope = {
export const template = ``;
export const walks = open(3) + get + next(1) + get + next(1) + close;
export const render = () => {
- write(Index.CLICK_COUNT, 0);
- renderClickCount();
- hydrate();
+ execClickCount(0);
};
-export const hydrate = register("", () => {
- hydrateClickCount();
-});
-
-const renderClickCount = () => {
- data(Index.BUTTON_TEXT, read(Index.CLICK_COUNT));
+const execClickCount = (value: scope[Index.CLICK_COUNT]) => {
+ if (write(Index.CLICK_COUNT, value)) {
+ data(Index.BUTTON_TEXT, value);
+ execClickHandler(value <= 1 ? bind(clickHandler) : false);
+ }
};
-const hydrateClickCount = () => {
+const execClickHandler = (value: scope[Index.EVENT_HANDLER]) => {
+ if (write(Index.EVENT_HANDLER, value)) {
+ attachEventHandler();
+ }
+};
+
+export const attachEventHandler = () => {
on(
Index.BUTTON,
"click",
- read(Index.CLICK_COUNT) <= 1
- ? bind(clickHandler)
- : false
+ read(Index.EVENT_HANDLER)
);
};
-const execClickCount = () => {
- renderClickCount();
- hydrateClickCount();
-};
-
const clickHandler = () => {
- if (
- write(
- Index.CLICK_COUNT,
- read(Index.CLICK_COUNT) + 1
- )
- ) {
- queue(execClickCount);
- }
+ queue(
+ execClickCount as any,
+ Index.CLICK_COUNT,
+ read(Index.CLICK_COUNT) + 1
+ );
};
export default createRenderFn(template, walks, render, 0);
diff --git a/packages/runtime/test/dom/fixtures/event-handlers/snapshot.expected.md b/packages/runtime/test/fixtures/event-handlers/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/event-handlers/snapshot.expected.md
rename to packages/runtime/test/fixtures/event-handlers/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/event-handlers/test.ts b/packages/runtime/test/fixtures/event-handlers/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/event-handlers/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/move-and-clear-children/index.ts b/packages/runtime/test/fixtures/move-and-clear-children/browser.ts
similarity index 98%
rename from packages/runtime/test/dom/fixtures/move-and-clear-children/index.ts
rename to packages/runtime/test/fixtures/move-and-clear-children/browser.ts
index 2e24e81db..45dbd2cc0 100644
--- a/packages/runtime/test/dom/fixtures/move-and-clear-children/index.ts
+++ b/packages/runtime/test/fixtures/move-and-clear-children/browser.ts
@@ -5,7 +5,7 @@ import {
setLoopOf,
createRenderer,
createRenderFn
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { open, close, get, next, over, skip } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/move-and-clear-children/snapshot.expected.md b/packages/runtime/test/fixtures/move-and-clear-children/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/move-and-clear-children/snapshot.expected.md
rename to packages/runtime/test/fixtures/move-and-clear-children/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/move-and-clear-children/test.ts b/packages/runtime/test/fixtures/move-and-clear-children/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/move-and-clear-children/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/move-and-clear-top-level/index.ts b/packages/runtime/test/fixtures/move-and-clear-top-level/browser.ts
similarity index 98%
rename from packages/runtime/test/dom/fixtures/move-and-clear-top-level/index.ts
rename to packages/runtime/test/fixtures/move-and-clear-top-level/browser.ts
index 0cc8a36e7..3ff490a16 100644
--- a/packages/runtime/test/dom/fixtures/move-and-clear-top-level/index.ts
+++ b/packages/runtime/test/fixtures/move-and-clear-top-level/browser.ts
@@ -5,7 +5,7 @@ import {
setLoopOf,
createRenderer,
createRenderFn
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { open, close, next, over, get, skip } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/move-and-clear-top-level/snapshot.expected.md b/packages/runtime/test/fixtures/move-and-clear-top-level/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/move-and-clear-top-level/snapshot.expected.md
rename to packages/runtime/test/fixtures/move-and-clear-top-level/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/move-and-clear-top-level/test.ts b/packages/runtime/test/fixtures/move-and-clear-top-level/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/move-and-clear-top-level/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/html/fixtures/placeholder-context/index.ts b/packages/runtime/test/fixtures/placeholder-context/server.ts
similarity index 76%
rename from packages/runtime/test/html/fixtures/placeholder-context/index.ts
rename to packages/runtime/test/fixtures/placeholder-context/server.ts
index 9c3ad7511..a3ea6fd0f 100644
--- a/packages/runtime/test/html/fixtures/placeholder-context/index.ts
+++ b/packages/runtime/test/fixtures/placeholder-context/server.ts
@@ -2,9 +2,9 @@ import {
pushContext,
popContext,
getInContext
-} from "../../../../src/common/context";
-import { tryPlaceholder, write, fork } from "../../../../src/html/index";
-import { resolveAfter } from "../../../utils/resolve";
+} from "../../../src/common/context";
+import { tryPlaceholder, write, fork } from "../../../src/html/index";
+import { resolveAfter } from "../../utils/resolve";
const k = "KEY";
const renderer = () => {
diff --git a/packages/runtime/test/fixtures/placeholder-context/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/placeholder-context/snapshots/server-hydrate.expected.md
new file mode 100644
index 000000000..e6b10ea36
--- /dev/null
+++ b/packages/runtime/test/fixtures/placeholder-context/snapshots/server-hydrate.expected.md
@@ -0,0 +1,50 @@
+# Write
+ ae...f
+
+
+# Write
+ gh
+ context cleared
+
+
+# Write
+ bc2d
+
+
+# Render "End"
+```html
+
+
+
+
+ abc2dfgh
+context cleared
+
+
+
+```
+
+# Mutations
+```
+inserted #document/#comment0
+inserted #document/html1
+inserted #document/html1/head0
+inserted #document/html1/body1
+inserted #document/html1/body1/#text0
+inserted #comment
+inserted #text
+inserted #comment
+inserted #document/html1/body1/#text2
+inserted #document/html1/body1/#comment3
+inserted t
+inserted #document/html1/body1/#text1
+inserted script
+inserted script/#text0
+removed #document/html1/body1/#text1 in t
+inserted #document/html1/body1/#text1
+removed script after t
+removed t after #document/html1/body1/#comment3
+removed #comment after #document/html1/body1/#text1
+removed #text after #document/html1/body1/#text1
+removed #comment after #document/html1/body1/#text1
+```
\ No newline at end of file
diff --git a/packages/runtime/test/fixtures/placeholder-context/test.ts b/packages/runtime/test/fixtures/placeholder-context/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/placeholder-context/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/html/fixtures/placeholder-single/index.ts b/packages/runtime/test/fixtures/placeholder-single/server.ts
similarity index 69%
rename from packages/runtime/test/html/fixtures/placeholder-single/index.ts
rename to packages/runtime/test/fixtures/placeholder-single/server.ts
index 4ac08ebf2..923a146ec 100644
--- a/packages/runtime/test/html/fixtures/placeholder-single/index.ts
+++ b/packages/runtime/test/fixtures/placeholder-single/server.ts
@@ -1,5 +1,5 @@
-import { tryPlaceholder, write, fork } from "../../../../src/html/index";
-import { resolveAfter } from "../../../utils/resolve";
+import { tryPlaceholder, write, fork } from "../../../src/html/index";
+import { resolveAfter } from "../../utils/resolve";
const renderer = () => {
write("a");
diff --git a/packages/runtime/test/fixtures/placeholder-single/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/placeholder-single/snapshots/server-hydrate.expected.md
new file mode 100644
index 000000000..6d1cb8f4a
--- /dev/null
+++ b/packages/runtime/test/fixtures/placeholder-single/snapshots/server-hydrate.expected.md
@@ -0,0 +1,48 @@
+# Write
+ ae...f
+
+
+# Write
+ gh
+
+
+# Write
+ bcd
+
+
+# Render "End"
+```html
+
+
+
+
+ abcdfgh
+
+
+
+```
+
+# Mutations
+```
+inserted #document/#comment0
+inserted #document/html1
+inserted #document/html1/head0
+inserted #document/html1/body1
+inserted #document/html1/body1/#text0
+inserted #comment
+inserted #text
+inserted #comment
+inserted #document/html1/body1/#text2
+inserted #document/html1/body1/#comment3
+inserted t
+inserted #document/html1/body1/#text1
+inserted script
+inserted script/#text0
+removed #document/html1/body1/#text1 in t
+inserted #document/html1/body1/#text1
+removed script after t
+removed t after #document/html1/body1/#comment3
+removed #comment after #document/html1/body1/#text1
+removed #text after #document/html1/body1/#text1
+removed #comment after #document/html1/body1/#text1
+```
\ No newline at end of file
diff --git a/packages/runtime/test/fixtures/placeholder-single/test.ts b/packages/runtime/test/fixtures/placeholder-single/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/placeholder-single/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/html/fixtures/placeholder-skipped/index.ts b/packages/runtime/test/fixtures/placeholder-skipped/server.ts
similarity index 64%
rename from packages/runtime/test/html/fixtures/placeholder-skipped/index.ts
rename to packages/runtime/test/fixtures/placeholder-skipped/server.ts
index 78eaedcc6..217e1f54e 100644
--- a/packages/runtime/test/html/fixtures/placeholder-skipped/index.ts
+++ b/packages/runtime/test/fixtures/placeholder-skipped/server.ts
@@ -1,5 +1,5 @@
-import { tryPlaceholder, write, fork } from "../../../../src/html/index";
-import { resolveAfter } from "../../../utils/resolve";
+import { tryPlaceholder, write, fork } from "../../../src/html/index";
+import { resolveAfter } from "../../utils/resolve";
const renderer = () => {
write("a");
diff --git a/packages/runtime/test/fixtures/placeholder-skipped/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/placeholder-skipped/snapshots/server-hydrate.expected.md
new file mode 100644
index 000000000..a5a198d26
--- /dev/null
+++ b/packages/runtime/test/fixtures/placeholder-skipped/snapshots/server-hydrate.expected.md
@@ -0,0 +1,29 @@
+# Write
+ abd
+
+
+# Write
+ ef
+
+
+# Render "End"
+```html
+
+
+
+
+ abdef
+
+
+
+```
+
+# Mutations
+```
+inserted #document/#comment0
+inserted #document/html1
+inserted #document/html1/head0
+inserted #document/html1/body1
+inserted #document/html1/body1/#text0
+inserted #document/html1/body1/#comment1
+```
\ No newline at end of file
diff --git a/packages/runtime/test/fixtures/placeholder-skipped/test.ts b/packages/runtime/test/fixtures/placeholder-skipped/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/placeholder-skipped/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/html/fixtures/placeholders-nested/index.ts b/packages/runtime/test/fixtures/placeholders-nested/server.ts
similarity index 79%
rename from packages/runtime/test/html/fixtures/placeholders-nested/index.ts
rename to packages/runtime/test/fixtures/placeholders-nested/server.ts
index d6d216f96..79ce0a120 100644
--- a/packages/runtime/test/html/fixtures/placeholders-nested/index.ts
+++ b/packages/runtime/test/fixtures/placeholders-nested/server.ts
@@ -1,5 +1,5 @@
-import { tryPlaceholder, write, fork } from "../../../../src/html/index";
-import { resolveAfter } from "../../../utils/resolve";
+import { tryPlaceholder, write, fork } from "../../../src/html/index";
+import { resolveAfter } from "../../utils/resolve";
const renderer = () => {
write("a");
diff --git a/packages/runtime/test/fixtures/placeholders-nested/snapshots/server-hydrate.expected.md b/packages/runtime/test/fixtures/placeholders-nested/snapshots/server-hydrate.expected.md
new file mode 100644
index 000000000..0df43660d
--- /dev/null
+++ b/packages/runtime/test/fixtures/placeholders-nested/snapshots/server-hydrate.expected.md
@@ -0,0 +1,72 @@
+# Write
+ ai...j
+
+
+# Write
+ kl
+
+
+# Write
+ bcdh...
+
+
+# Write
+ efg
+
+
+# Render "End"
+```html
+
+
+
+
+ abcdefgjkl
+
+
+
+```
+
+# Mutations
+```
+inserted #document/#comment0
+inserted #document/html1
+inserted #document/html1/head0
+inserted #document/html1/body1
+inserted #document/html1/body1/#text0
+inserted #comment
+inserted #text
+inserted #comment
+inserted #document/html1/body1/#text3
+inserted #document/html1/body1/#comment4
+inserted t
+inserted #document/html1/body1/#text1
+inserted #comment
+inserted #text
+inserted #comment
+inserted script
+inserted script/#text0
+removed #document/html1/body1/#text1 before #comment
+inserted #document/html1/body1/#text1
+removed #comment before #text
+inserted #comment
+removed #text before #comment
+inserted #text
+removed #comment in t
+inserted #comment
+removed script after t
+removed t after #document/html1/body1/#comment4
+removed #comment after #comment
+removed #text after #comment
+removed #comment after #comment
+inserted t
+inserted #document/html1/body1/#text2
+inserted script
+inserted script/#text0
+removed #document/html1/body1/#text2 in t
+inserted #document/html1/body1/#text2
+removed script after t
+removed t after #document/html1/body1/#comment4
+removed #comment after #document/html1/body1/#text2
+removed #text after #document/html1/body1/#text2
+removed #comment after #document/html1/body1/#text2
+```
\ No newline at end of file
diff --git a/packages/runtime/test/fixtures/placeholders-nested/test.ts b/packages/runtime/test/fixtures/placeholders-nested/test.ts
new file mode 100644
index 000000000..27082ef3a
--- /dev/null
+++ b/packages/runtime/test/fixtures/placeholders-nested/test.ts
@@ -0,0 +1 @@
+export default [{}];
diff --git a/packages/runtime/test/dom/fixtures/remove-and-add-rows/index.ts b/packages/runtime/test/fixtures/remove-and-add-rows/browser.ts
similarity index 98%
rename from packages/runtime/test/dom/fixtures/remove-and-add-rows/index.ts
rename to packages/runtime/test/fixtures/remove-and-add-rows/browser.ts
index c3ee09c92..19e510e3c 100644
--- a/packages/runtime/test/dom/fixtures/remove-and-add-rows/index.ts
+++ b/packages/runtime/test/fixtures/remove-and-add-rows/browser.ts
@@ -5,7 +5,7 @@ import {
setLoopOf,
createRenderer,
createRenderFn
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { get, next, open, close, skip } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/remove-and-add-rows/snapshot.expected.md b/packages/runtime/test/fixtures/remove-and-add-rows/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/remove-and-add-rows/snapshot.expected.md
rename to packages/runtime/test/fixtures/remove-and-add-rows/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/remove-and-add-rows/test.ts b/packages/runtime/test/fixtures/remove-and-add-rows/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/remove-and-add-rows/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/switch-adjacent-only-children/index.ts b/packages/runtime/test/fixtures/switch-adjacent-only-children/browser.ts
similarity index 98%
rename from packages/runtime/test/dom/fixtures/switch-adjacent-only-children/index.ts
rename to packages/runtime/test/fixtures/switch-adjacent-only-children/browser.ts
index 38dd41df9..97767f477 100644
--- a/packages/runtime/test/dom/fixtures/switch-adjacent-only-children/index.ts
+++ b/packages/runtime/test/fixtures/switch-adjacent-only-children/browser.ts
@@ -5,7 +5,7 @@ import {
setLoopOf,
createRenderer,
createRenderFn
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { get, next, open, close, skip } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/switch-adjacent-only-children/snapshot.expected.md b/packages/runtime/test/fixtures/switch-adjacent-only-children/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/switch-adjacent-only-children/snapshot.expected.md
rename to packages/runtime/test/fixtures/switch-adjacent-only-children/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/switch-adjacent-only-children/test.ts b/packages/runtime/test/fixtures/switch-adjacent-only-children/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/switch-adjacent-only-children/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/toggle-context.skip/index.ts b/packages/runtime/test/fixtures/toggle-context.skip/browser.ts
similarity index 100%
rename from packages/runtime/test/dom/fixtures/toggle-context.skip/index.ts
rename to packages/runtime/test/fixtures/toggle-context.skip/browser.ts
diff --git a/packages/runtime/test/dom/fixtures/toggle-context.skip/snapshot.expected.md b/packages/runtime/test/fixtures/toggle-context.skip/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/toggle-context.skip/snapshot.expected.md
rename to packages/runtime/test/fixtures/toggle-context.skip/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/toggle-context.skip/test.ts b/packages/runtime/test/fixtures/toggle-context.skip/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/toggle-context.skip/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/toggle-detached-state/index.ts b/packages/runtime/test/fixtures/toggle-detached-state/browser.ts
similarity index 98%
rename from packages/runtime/test/dom/fixtures/toggle-detached-state/index.ts
rename to packages/runtime/test/fixtures/toggle-detached-state/browser.ts
index a039950bf..2fbece137 100644
--- a/packages/runtime/test/dom/fixtures/toggle-detached-state/index.ts
+++ b/packages/runtime/test/fixtures/toggle-detached-state/browser.ts
@@ -8,7 +8,7 @@ import {
createRenderer,
createRenderFn,
queueInBranch
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { next, get, over, open, close } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/toggle-detached-state/snapshot.expected.md b/packages/runtime/test/fixtures/toggle-detached-state/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/toggle-detached-state/snapshot.expected.md
rename to packages/runtime/test/fixtures/toggle-detached-state/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/toggle-detached-state/test.ts b/packages/runtime/test/fixtures/toggle-detached-state/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/toggle-detached-state/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/toggle-first-child/index.ts b/packages/runtime/test/fixtures/toggle-first-child/browser.ts
similarity index 97%
rename from packages/runtime/test/dom/fixtures/toggle-first-child/index.ts
rename to packages/runtime/test/fixtures/toggle-first-child/browser.ts
index 16245016b..e780507c5 100644
--- a/packages/runtime/test/dom/fixtures/toggle-first-child/index.ts
+++ b/packages/runtime/test/fixtures/toggle-first-child/browser.ts
@@ -7,7 +7,7 @@ import {
createRenderFn,
readInOwner,
queueInBranch
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { next, over, get, open, close } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/toggle-first-child/snapshot.expected.md b/packages/runtime/test/fixtures/toggle-first-child/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/toggle-first-child/snapshot.expected.md
rename to packages/runtime/test/fixtures/toggle-first-child/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/toggle-first-child/test.ts b/packages/runtime/test/fixtures/toggle-first-child/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/toggle-first-child/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/toggle-last-child/index.ts b/packages/runtime/test/fixtures/toggle-last-child/browser.ts
similarity index 97%
rename from packages/runtime/test/dom/fixtures/toggle-last-child/index.ts
rename to packages/runtime/test/fixtures/toggle-last-child/browser.ts
index 1ca36832e..21bb32479 100644
--- a/packages/runtime/test/dom/fixtures/toggle-last-child/index.ts
+++ b/packages/runtime/test/fixtures/toggle-last-child/browser.ts
@@ -7,7 +7,7 @@ import {
createRenderFn,
readInOwner,
queueInBranch
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { next, over, get, open, close } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/toggle-last-child/snapshot.expected.md b/packages/runtime/test/fixtures/toggle-last-child/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/toggle-last-child/snapshot.expected.md
rename to packages/runtime/test/fixtures/toggle-last-child/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/toggle-last-child/test.ts b/packages/runtime/test/fixtures/toggle-last-child/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/toggle-last-child/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/toggle-middle-child/index.ts b/packages/runtime/test/fixtures/toggle-middle-child/browser.ts
similarity index 97%
rename from packages/runtime/test/dom/fixtures/toggle-middle-child/index.ts
rename to packages/runtime/test/fixtures/toggle-middle-child/browser.ts
index edef75a84..b370c3799 100644
--- a/packages/runtime/test/dom/fixtures/toggle-middle-child/index.ts
+++ b/packages/runtime/test/fixtures/toggle-middle-child/browser.ts
@@ -7,7 +7,7 @@ import {
createRenderFn,
readInOwner,
queueInBranch
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { next, over, get, open, close } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/toggle-middle-child/snapshot.expected.md b/packages/runtime/test/fixtures/toggle-middle-child/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/toggle-middle-child/snapshot.expected.md
rename to packages/runtime/test/fixtures/toggle-middle-child/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/toggle-middle-child/test.ts b/packages/runtime/test/fixtures/toggle-middle-child/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/toggle-middle-child/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/toggle-nested/index.ts b/packages/runtime/test/fixtures/toggle-nested/browser.ts
similarity index 99%
rename from packages/runtime/test/dom/fixtures/toggle-nested/index.ts
rename to packages/runtime/test/fixtures/toggle-nested/browser.ts
index 82cd31471..18b14d5c6 100644
--- a/packages/runtime/test/dom/fixtures/toggle-nested/index.ts
+++ b/packages/runtime/test/fixtures/toggle-nested/browser.ts
@@ -11,7 +11,7 @@ import {
queue,
readInOwner,
queueInBranch
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { next, over, get, open, close, skip } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/toggle-nested/snapshot.expected.md b/packages/runtime/test/fixtures/toggle-nested/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/toggle-nested/snapshot.expected.md
rename to packages/runtime/test/fixtures/toggle-nested/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/toggle-nested/test.ts b/packages/runtime/test/fixtures/toggle-nested/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/toggle-nested/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/toggle-only-child/index.ts b/packages/runtime/test/fixtures/toggle-only-child/browser.ts
similarity index 97%
rename from packages/runtime/test/dom/fixtures/toggle-only-child/index.ts
rename to packages/runtime/test/fixtures/toggle-only-child/browser.ts
index 6be7a6d5f..db40c58f7 100644
--- a/packages/runtime/test/dom/fixtures/toggle-only-child/index.ts
+++ b/packages/runtime/test/fixtures/toggle-only-child/browser.ts
@@ -7,7 +7,7 @@ import {
write,
readInOwner,
queueInBranch
-} from "../../../../src/dom/index";
+} from "../../../src/dom/index";
import { get, next, over, open, close } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/toggle-only-child/snapshot.expected.md b/packages/runtime/test/fixtures/toggle-only-child/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/toggle-only-child/snapshot.expected.md
rename to packages/runtime/test/fixtures/toggle-only-child/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/toggle-only-child/test.ts b/packages/runtime/test/fixtures/toggle-only-child/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/toggle-only-child/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/update-attr/index.ts b/packages/runtime/test/fixtures/update-attr/browser.ts
similarity index 91%
rename from packages/runtime/test/dom/fixtures/update-attr/index.ts
rename to packages/runtime/test/fixtures/update-attr/browser.ts
index 90dea5caf..19d0e5ed4 100644
--- a/packages/runtime/test/dom/fixtures/update-attr/index.ts
+++ b/packages/runtime/test/fixtures/update-attr/browser.ts
@@ -1,4 +1,4 @@
-import { attr, createRenderFn, write, read } from "../../../../src/dom/index";
+import { attr, createRenderFn, write, read } from "../../../src/dom/index";
import { get, over, open, close } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/update-attr/snapshot.expected.md b/packages/runtime/test/fixtures/update-attr/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/update-attr/snapshot.expected.md
rename to packages/runtime/test/fixtures/update-attr/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/update-attr/test.ts b/packages/runtime/test/fixtures/update-attr/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/update-attr/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/update-dynamic-attrs/index.ts b/packages/runtime/test/fixtures/update-dynamic-attrs/browser.ts
similarity index 91%
rename from packages/runtime/test/dom/fixtures/update-dynamic-attrs/index.ts
rename to packages/runtime/test/fixtures/update-dynamic-attrs/browser.ts
index 50343b046..8ce3415f1 100644
--- a/packages/runtime/test/dom/fixtures/update-dynamic-attrs/index.ts
+++ b/packages/runtime/test/fixtures/update-dynamic-attrs/browser.ts
@@ -1,4 +1,4 @@
-import { attrs, createRenderFn, write } from "../../../../src/dom/index";
+import { attrs, createRenderFn, write } from "../../../src/dom/index";
import { get, over, open, close } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/update-dynamic-attrs/snapshot.expected.md b/packages/runtime/test/fixtures/update-dynamic-attrs/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/update-dynamic-attrs/snapshot.expected.md
rename to packages/runtime/test/fixtures/update-dynamic-attrs/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/update-dynamic-attrs/test.ts b/packages/runtime/test/fixtures/update-dynamic-attrs/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/update-dynamic-attrs/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/update-html/index.ts b/packages/runtime/test/fixtures/update-html/browser.ts
similarity index 91%
rename from packages/runtime/test/dom/fixtures/update-html/index.ts
rename to packages/runtime/test/fixtures/update-html/browser.ts
index 8150d9aba..de18bb019 100644
--- a/packages/runtime/test/dom/fixtures/update-html/index.ts
+++ b/packages/runtime/test/fixtures/update-html/browser.ts
@@ -1,4 +1,4 @@
-import { html, read, write, createRenderFn } from "../../../../src/dom/index";
+import { html, read, write, createRenderFn } from "../../../src/dom/index";
import { over, get, open, close } from "../../utils/walks";
export const inputs = [
diff --git a/packages/runtime/test/dom/fixtures/update-html/snapshot.expected.md b/packages/runtime/test/fixtures/update-html/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/update-html/snapshot.expected.md
rename to packages/runtime/test/fixtures/update-html/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/update-html/test.ts b/packages/runtime/test/fixtures/update-html/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/update-html/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/dom/fixtures/update-text/index.ts b/packages/runtime/test/fixtures/update-text/browser.ts
similarity index 61%
rename from packages/runtime/test/dom/fixtures/update-text/index.ts
rename to packages/runtime/test/fixtures/update-text/browser.ts
index d287710dd..9a1456648 100644
--- a/packages/runtime/test/dom/fixtures/update-text/index.ts
+++ b/packages/runtime/test/fixtures/update-text/browser.ts
@@ -1,18 +1,6 @@
-import { data, read, write, createRenderFn } from "../../../../src/dom/index";
+import { data, read, write, createRenderFn } from "../../../src/dom/index";
import { after, over, open, close } from "../../utils/walks";
-export const inputs = [
- {
- value: "Dynamic 1"
- },
- {
- value: "Dynamic 2"
- },
- {
- value: "Dynamic 3"
- }
-];
-
const enum Index {
TEXT = 0,
INPUT_VALUE = 1
@@ -20,7 +8,7 @@ const enum Index {
type scope = {
[Index.TEXT]: Text;
- [Index.INPUT_VALUE]: typeof inputs[number]["value"];
+ [Index.INPUT_VALUE]: string;
};
// Static ${input.value}
@@ -31,7 +19,7 @@ export const execInputValue = () => {
data(Index.TEXT, read(Index.INPUT_VALUE));
};
-export const execDynamicInput = (input: typeof inputs[number]) => {
+export const execDynamicInput = (input: { value: string }) => {
if (write(Index.INPUT_VALUE, input.value)) {
execInputValue();
}
diff --git a/packages/runtime/test/dom/fixtures/update-text/snapshot.expected.md b/packages/runtime/test/fixtures/update-text/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/update-text/snapshot.expected.md
rename to packages/runtime/test/fixtures/update-text/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/update-text/test.ts b/packages/runtime/test/fixtures/update-text/test.ts
new file mode 100644
index 000000000..364c35f2f
--- /dev/null
+++ b/packages/runtime/test/fixtures/update-text/test.ts
@@ -0,0 +1,11 @@
+export default [
+ {
+ value: "Dynamic 1"
+ },
+ {
+ value: "Dynamic 2"
+ },
+ {
+ value: "Dynamic 3"
+ }
+];
diff --git a/packages/runtime/test/dom/fixtures/user-effect-cleanup/index.ts b/packages/runtime/test/fixtures/user-effect-cleanup/browser.ts
similarity index 95%
rename from packages/runtime/test/dom/fixtures/user-effect-cleanup/index.ts
rename to packages/runtime/test/fixtures/user-effect-cleanup/browser.ts
index e9a4e1a75..fea1ffcde 100644
--- a/packages/runtime/test/dom/fixtures/user-effect-cleanup/index.ts
+++ b/packages/runtime/test/fixtures/user-effect-cleanup/browser.ts
@@ -6,8 +6,8 @@ import {
read,
write,
bind
-} from "../../../../src/dom/index";
-import { wait } from "../../../utils/resolve";
+} from "../../../src/dom/index";
+import { wait } from "../../utils/resolve";
import { get, next, open, close } from "../../utils/walks";
export const inputs = [{ value: 0 }, wait(4), { value: 1 }, wait(4)] as const;
diff --git a/packages/runtime/test/dom/fixtures/user-effect-cleanup/snapshot.expected.md b/packages/runtime/test/fixtures/user-effect-cleanup/snapshots/client-only.expected.md
similarity index 100%
rename from packages/runtime/test/dom/fixtures/user-effect-cleanup/snapshot.expected.md
rename to packages/runtime/test/fixtures/user-effect-cleanup/snapshots/client-only.expected.md
diff --git a/packages/runtime/test/fixtures/user-effect-cleanup/test.ts b/packages/runtime/test/fixtures/user-effect-cleanup/test.ts
new file mode 100644
index 000000000..80ca4cbeb
--- /dev/null
+++ b/packages/runtime/test/fixtures/user-effect-cleanup/test.ts
@@ -0,0 +1,2 @@
+import { inputs } from "./browser";
+export default inputs;
diff --git a/packages/runtime/test/html/fixtures/async-nested-resolve-in-order/snapshot.expected.md b/packages/runtime/test/html/fixtures/async-nested-resolve-in-order/snapshot.expected.md
deleted file mode 100644
index 19e309bd8..000000000
--- a/packages/runtime/test/html/fixtures/async-nested-resolve-in-order/snapshot.expected.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# write
- a
-_flush_
-
-# write
- b
-_flush_
-
-# write
- c
-_flush_
-
-# write
- defghi
-_flush_
-
-# write
- jkl
-_flush_
-
-# end
-
-# final HTML
-
-
-
- abcdefghijkl
-
-
diff --git a/packages/runtime/test/html/fixtures/async-resolve-in-order/snapshot.expected.md b/packages/runtime/test/html/fixtures/async-resolve-in-order/snapshot.expected.md
deleted file mode 100644
index 838490a40..000000000
--- a/packages/runtime/test/html/fixtures/async-resolve-in-order/snapshot.expected.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# write
- a
-_flush_
-
-# write
- bc
-_flush_
-
-# write
- de
-_flush_
-
-# end
-
-# final HTML
-
-
- abcde
-
-
diff --git a/packages/runtime/test/html/fixtures/async-resolve-out-of-order/snapshot.expected.md b/packages/runtime/test/html/fixtures/async-resolve-out-of-order/snapshot.expected.md
deleted file mode 100644
index a0513d072..000000000
--- a/packages/runtime/test/html/fixtures/async-resolve-out-of-order/snapshot.expected.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# write
- a
-_flush_
-
-# write
- bcde
-_flush_
-
-# end
-
-# final HTML
-
-
- abcde
-
-
diff --git a/packages/runtime/test/html/fixtures/catch-single-reject-async/snapshot.expected.md b/packages/runtime/test/html/fixtures/catch-single-reject-async/snapshot.expected.md
deleted file mode 100644
index 7905b0f7c..000000000
--- a/packages/runtime/test/html/fixtures/catch-single-reject-async/snapshot.expected.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# write
- ab
-_flush_
-
-# write
- defg
-_flush_
-
-# write
- ERROR!
-_flush_
-
-# end
-
-# final HTML
-
-
- aERROR!efg
-
-
diff --git a/packages/runtime/test/html/fixtures/catch-single-success-async/snapshot.expected.md b/packages/runtime/test/html/fixtures/catch-single-success-async/snapshot.expected.md
deleted file mode 100644
index b937ee124..000000000
--- a/packages/runtime/test/html/fixtures/catch-single-success-async/snapshot.expected.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# write
- ab
-_flush_
-
-# write
- cdfgh
-_flush_
-
-# end
-
-# final HTML
-
-
- a
-
- bcd
-
- fgh
-
-
diff --git a/packages/runtime/test/html/fixtures/catch-single-success-sync/snapshot.expected.md b/packages/runtime/test/html/fixtures/catch-single-success-sync/snapshot.expected.md
deleted file mode 100644
index 875874094..000000000
--- a/packages/runtime/test/html/fixtures/catch-single-success-sync/snapshot.expected.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# write
- abc
-_flush_
-
-# end
-
-# final HTML
-
-
- abc
-
-
diff --git a/packages/runtime/test/html/fixtures/catch-single-throw-sync/snapshot.expected.md b/packages/runtime/test/html/fixtures/catch-single-throw-sync/snapshot.expected.md
deleted file mode 100644
index 632f7a34a..000000000
--- a/packages/runtime/test/html/fixtures/catch-single-throw-sync/snapshot.expected.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# write
- aERROR!d
-_flush_
-
-# end
-
-# final HTML
-
-
- aERROR!d
-
-
diff --git a/packages/runtime/test/html/fixtures/component-markers-async.skip/index.ts b/packages/runtime/test/html/fixtures/component-markers-async.skip/index.ts
deleted file mode 100644
index 1c4d938bb..000000000
--- a/packages/runtime/test/html/fixtures/component-markers-async.skip/index.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { write, fork, register } from "../../../../src/html/index";
-import { resolveAfter } from "../../../utils/resolve";
-
-const renderer = () => {
- firstComponent({});
- secondComponent({});
-};
-
-const firstComponent = register("first", () => {
- write("x");
- write("y");
- write("z");
-});
-
-const secondComponent = register("second", () => {
- write("a");
- fork(resolveAfter("b", 1), write);
- fork(resolveAfter("c", 2), write);
-});
-
-export default renderer;
diff --git a/packages/runtime/test/html/fixtures/error-async/snapshot.expected.md b/packages/runtime/test/html/fixtures/error-async/snapshot.expected.md
deleted file mode 100644
index ab759cefe..000000000
--- a/packages/runtime/test/html/fixtures/error-async/snapshot.expected.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# write
- a
-_flush_
-
-# write
- b
-_flush_
-
-# emit error
- Error: ERROR!
-
-# end
-
-# final HTML
-
-
- ab
-
-
diff --git a/packages/runtime/test/html/fixtures/error-sync/snapshot.expected.md b/packages/runtime/test/html/fixtures/error-sync/snapshot.expected.md
deleted file mode 100644
index 7b4cbc3a2..000000000
--- a/packages/runtime/test/html/fixtures/error-sync/snapshot.expected.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# write
- a
-_flush_
-
-# emit error
- Error: ERROR!
-
-# end
-
-# final HTML
-
-
- a
-
-
diff --git a/packages/runtime/test/html/fixtures/placeholder-context/snapshot.expected.md b/packages/runtime/test/html/fixtures/placeholder-context/snapshot.expected.md
deleted file mode 100644
index e3eefd54b..000000000
--- a/packages/runtime/test/html/fixtures/placeholder-context/snapshot.expected.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# write
- ae...f
-_flush_
-
-# write
- gh
- context cleared
-_flush_
-
-# write
- bc2d
-_flush_
-
-# end
-
-# final HTML
-
-
- abc2dfgh
- context cleared
-
-
diff --git a/packages/runtime/test/html/fixtures/placeholder-single/snapshot.expected.md b/packages/runtime/test/html/fixtures/placeholder-single/snapshot.expected.md
deleted file mode 100644
index 05a54000f..000000000
--- a/packages/runtime/test/html/fixtures/placeholder-single/snapshot.expected.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# write
- ae...f
-_flush_
-
-# write
- gh
-_flush_
-
-# write
- bcd
-_flush_
-
-# end
-
-# final HTML
-
-
- abcdfgh
-
-
diff --git a/packages/runtime/test/html/fixtures/placeholder-skipped/snapshot.expected.md b/packages/runtime/test/html/fixtures/placeholder-skipped/snapshot.expected.md
deleted file mode 100644
index 2262a8314..000000000
--- a/packages/runtime/test/html/fixtures/placeholder-skipped/snapshot.expected.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# write
- abd
-_flush_
-
-# write
- ef
-_flush_
-
-# end
-
-# final HTML
-
-
- abdef
-
-
diff --git a/packages/runtime/test/html/fixtures/placeholders-nested/snapshot.expected.md b/packages/runtime/test/html/fixtures/placeholders-nested/snapshot.expected.md
deleted file mode 100644
index bb41c7bad..000000000
--- a/packages/runtime/test/html/fixtures/placeholders-nested/snapshot.expected.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# write
- ai...j
-_flush_
-
-# write
- kl
-_flush_
-
-# write
- bcdh...
-_flush_
-
-# write
- efg
-_flush_
-
-# end
-
-# final HTML
-
-
- abcdefgjkl
-
-
diff --git a/packages/runtime/test/html/main.test.ts b/packages/runtime/test/html/main.test.ts
deleted file mode 100644
index e9127dc5e..000000000
--- a/packages/runtime/test/html/main.test.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import fs from "fs";
-import path from "path";
-import snapshot from "../utils/snapshot";
-import renderAndTrackFlushes from "./utils/render-and-track-flushes";
-
-const FIXTURES_DIR = path.join(__dirname, "./fixtures");
-
-describe("HTML", () => {
- fs.readdirSync(FIXTURES_DIR)
- .filter(entry => !/\.skip$/.test(entry))
- .filter(entry => !/\.DS_STORE$/i.test(entry))
- .map(entry => {
- const testDir = path.join(FIXTURES_DIR, entry);
- const testFile = path.join(testDir, "index.ts");
- it(entry, async () => {
- snapshot(
- testDir,
- "snapshot.md",
- await renderAndTrackFlushes(require(testFile))
- );
- });
- });
-});
diff --git a/packages/runtime/test/html/utils/render-and-track-flushes.ts b/packages/runtime/test/html/utils/render-and-track-flushes.ts
deleted file mode 100644
index 02cf490f5..000000000
--- a/packages/runtime/test/html/utils/render-and-track-flushes.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { JSDOM } from "jsdom";
-import { Writable } from "stream";
-import format from "pretty-format";
-import { createRenderer } from "../../../src/html/index";
-import reorderRuntime from "../../../src/html/reorder-runtime";
-
-const { DOMElement, DOMCollection } = format.plugins;
-const reorderRuntimeString = String(reorderRuntime).replace("RUNTIME_ID", "M");
-
-export default async function renderAndTrackFlushes(test: {
- input: Record;
- default: (input: Record) => void;
-}) {
- const { input } = test;
- const output: string[] = [];
- const render = createRenderer(test.default);
-
- let html = "";
-
- await render(input, {
- write(data: string) {
- html += data;
- output.push(
- `# write\n${indent(
- data.replace(reorderRuntimeString, "REORDER_RUNTIME")
- )}`
- );
- },
- flush() {
- output[output.length - 1] += `\n_flush_`;
- },
- end(data?: string) {
- output.push(`# end${data ? `\n${indent(data)}` : ""}`);
- },
- emit(type, ...args: unknown[]) {
- output.push(`# emit ${type}${args.map(arg => `\n${indent(arg)}`)}`);
- }
- } as Writable & { flush(): void });
-
- const browser = new JSDOM(html, { runScripts: "dangerously" });
- const root = browser.window.document;
- browser.window.queueMicrotask = queueMicrotask;
- browser.window.requestAnimationFrame = (fn => setTimeout(fn)) as any;
- root.normalize();
- output.push(
- `# final HTML\n${indent(
- Array.from(root.childNodes)
- .map(child =>
- format(child, {
- plugins: [DOMElement, DOMCollection]
- })
- )
- .join("\n")
- )}`
- );
-
- return `${output.join("\n\n")}\n`;
-}
-
-function indent(data: unknown) {
- return String(data)
- .split("\n")
- .map(line => ` ${line}`)
- .join("\n");
-}
diff --git a/packages/runtime/test/main.test.ts b/packages/runtime/test/main.test.ts
new file mode 100644
index 000000000..9abf4f1e3
--- /dev/null
+++ b/packages/runtime/test/main.test.ts
@@ -0,0 +1,198 @@
+import fs from "fs";
+import path from "path";
+import createBrowser from "./utils/create-browser";
+import { createRenderer } from "../src/html/index";
+import reorderRuntime from "../src/html/reorder-runtime";
+import { Writable } from "stream";
+import assert from "assert";
+import createTrackMutations from "./utils/track-mutations";
+import snapshot from "./utils/snapshot";
+import { isWait } from "./utils/resolve";
+
+const FIXTURES_DIR = path.join(__dirname, "./fixtures");
+const runtimeId = "M";
+const reorderRuntimeString = String(reorderRuntime).replace(
+ "RUNTIME_ID",
+ runtimeId
+);
+
+describe("runtime", function () {
+ this.timeout(10000);
+ fs.readdirSync(FIXTURES_DIR)
+ .filter(entry => !/\.skip$/.test(entry))
+ .map(entry => {
+ const testDir = path.join(FIXTURES_DIR, entry);
+ const snapshotDir = path.join(testDir, "snapshots");
+ const serverFile = path.join(testDir, "server.ts");
+ const hydrateFile = path.join(testDir, "hydrate.ts");
+ const browserFile = path.join(testDir, "browser.ts");
+ const testFile = path.join(testDir, "test.ts");
+ const skipSSR = !fs.existsSync(serverFile);
+ const skipHydrate = !fs.existsSync(hydrateFile);
+ const skipCSR = !fs.existsSync(browserFile);
+ describe(entry, () => {
+ let initialHTML: string;
+ let hydratedHTML: string;
+ (!skipSSR ? it : it.skip)(
+ `ssr${skipHydrate ? "" : " + hydrate"}`,
+ async () => {
+ const serverTemplate = require(serverFile);
+ const render = createRenderer(serverTemplate.default, true);
+
+ let buffer = "";
+ let flushCount = 0;
+
+ const browser = createBrowser({ dir: __dirname });
+ const test = browser.require(testFile);
+ const hydrateIndex = test.hydrateFlush;
+ const input = test.default[0];
+
+ const document = browser.window.document;
+
+ document.open();
+
+ const tracker = createTrackMutations(browser.window, document);
+
+ await render(input, {
+ write(data: string) {
+ buffer += data;
+ tracker.log(
+ `# Write\n${indent(
+ data.replace(reorderRuntimeString, "REORDER_RUNTIME")
+ )}`
+ );
+ },
+ flush() {
+ if (!skipHydrate && hydrateIndex === flushCount++) {
+ browser.require(hydrateFile);
+ tracker.logUpdate("Hydrate");
+ }
+ // tracker.logUpdate("Flush");
+ // document.write(buffer);
+ // buffer = "";
+ },
+ end(data?: string) {
+ document.write(buffer + (data || ""));
+ document.close();
+ tracker.logUpdate("End");
+ if (!skipHydrate && hydrateIndex == null) {
+ browser.require(hydrateFile);
+ tracker.logUpdate("Hydrate");
+ }
+ },
+ emit(type, ...args: unknown[]) {
+ tracker.log(
+ `# Emit ${type}${args.map(arg => `\n${indent(arg)}`)}`
+ );
+ }
+ } as Writable & { flush(): void });
+
+ hydratedHTML = getNormalizedHtml(document.body);
+
+ if (!skipHydrate) {
+ const { run } = browser.require(
+ "../src/dom/index"
+ ) as typeof import("../src/dom/index");
+
+ for (const update of test.default.slice(1)) {
+ if (isWait(update)) {
+ await update();
+ } else if (typeof update === "function") {
+ update(document.documentElement);
+ run();
+ tracker.logUpdate(update);
+ } else {
+ // if new input is detected, stop testing
+ // this will be covered by the client tests
+ break;
+ }
+ }
+ }
+
+ snapshot(snapshotDir, "server-hydrate.md", tracker.getLogs());
+ }
+ );
+ (!skipCSR ? it : it.skip)("csr", async () => {
+ const browser = createBrowser({ dir: __dirname });
+ const document = browser.window.document;
+ const test = browser.require(testFile);
+ const input = test.default[0];
+ const { run } = browser.require(
+ "../src/dom/index"
+ ) as typeof import("../src/dom/index");
+ const render = browser.require(browserFile).default;
+ const container = Object.assign(document.createElement("div"), {
+ TEST_ROOT: true
+ });
+ const tracker = createTrackMutations(browser.window, container);
+
+ document.body.appendChild(container);
+
+ const instance = render(input);
+ container.appendChild(instance);
+
+ initialHTML = getNormalizedHtml(container);
+ tracker.logUpdate(input);
+
+ for (const update of test.default.slice(1)) {
+ if (isWait(update)) {
+ await update();
+ } else if (typeof update === "function") {
+ update(document.documentElement);
+ run();
+ tracker.logUpdate(update);
+ } else {
+ instance.update(update);
+ tracker.logUpdate(update);
+ }
+ }
+
+ snapshot(snapshotDir, "client-only.md", tracker.getLogs());
+ });
+ (!skipSSR && !skipCSR ? it : it.skip)("equivalent", () => {
+ assert.strictEqual(hydratedHTML, initialHTML);
+ });
+ });
+ });
+});
+
+function indent(data: unknown) {
+ return String(data)
+ .split("\n")
+ .map(line => ` ${line}`)
+ .join("\n");
+}
+
+function getNormalizedHtml(container: Element) {
+ const clone = container.cloneNode(true) as Element;
+
+ const treeWalker = container.ownerDocument!.createTreeWalker(clone);
+ const nodesToRemove: ChildNode[] = [];
+
+ while (treeWalker.nextNode()) {
+ const node = treeWalker.currentNode;
+ if (node.nodeType === 8 || isIgnoredTag(node)) {
+ nodesToRemove.push(node as ChildNode);
+ } else if ((node as Element).tagName === "TEXTAREA") {
+ node.textContent = (node as HTMLTextAreaElement).value;
+ }
+ }
+
+ nodesToRemove.forEach(n => n.remove());
+ // clone.innerHTML = clone.innerHTML;
+ clone.normalize();
+
+ return clone.innerHTML.trim();
+}
+
+function isIgnoredTag(node) {
+ switch (node.tagName) {
+ case "LINK":
+ case "TITLE":
+ case "STYLE":
+ case "SCRIPT":
+ return true;
+ default:
+ return false;
+ }
+}
diff --git a/packages/runtime/test/dom/utils/get-node-info.ts b/packages/runtime/test/utils/get-node-info.ts
similarity index 100%
rename from packages/runtime/test/dom/utils/get-node-info.ts
rename to packages/runtime/test/utils/get-node-info.ts
diff --git a/packages/runtime/test/dom/utils/track-mutations.ts b/packages/runtime/test/utils/track-mutations.ts
similarity index 77%
rename from packages/runtime/test/dom/utils/track-mutations.ts
rename to packages/runtime/test/utils/track-mutations.ts
index 521095c3f..4f5ea3233 100644
--- a/packages/runtime/test/dom/utils/track-mutations.ts
+++ b/packages/runtime/test/utils/track-mutations.ts
@@ -3,6 +3,13 @@ import { getNodePath } from "./get-node-info";
const { DOMElement, DOMCollection } = format.plugins;
+import reorderRuntime from "../../src/html/reorder-runtime";
+const runtimeId = "M";
+const reorderRuntimeString = String(reorderRuntime).replace(
+ "RUNTIME_ID",
+ runtimeId
+);
+
export default function createMutationTracker(window, container) {
const result: string[] = [];
let currentRecords: unknown[] | null = null;
@@ -82,7 +89,11 @@ function getStatusString(container: HTMLDivElement, changes, update) {
.join("\n")}\n\`\`\``;
}
-function formatMutationRecord(record: MutationRecord) {
+function formatMutationRecord(
+ record: MutationRecord,
+ index: number,
+ allRecords: MutationRecord[]
+) {
const { target, oldValue } = record;
switch (record.type) {
@@ -97,9 +108,28 @@ function formatMutationRecord(record: MutationRecord) {
}
case "characterData": {
+ const newValue = target.nodeValue;
+
+ // if the new value begins with the old value
+ // and whitespace delimits the old value and remaining new value
+ if (
+ newValue?.indexOf(oldValue!) === 0 &&
+ (/\s$/ms.test(oldValue!) || /\s$/ms.test(newValue![oldValue!.length]))
+ ) {
+ // filter out invalid records that jsdom creates
+ // see https://github.com/jsdom/jsdom/issues/3261
+ // TODO: remove if fixed
+ return;
+ }
+
return `${getNodePath(target)}: ${JSON.stringify(
- oldValue
- )} => ${JSON.stringify(target.nodeValue)}`;
+ (oldValue || "").replace(reorderRuntimeString, "REORDER_RUNTIME")
+ )} => ${JSON.stringify(
+ (target.nodeValue || "").replace(
+ reorderRuntimeString,
+ "REORDER_RUNTIME"
+ )
+ )}`;
}
case "childList": {
diff --git a/packages/runtime/test/dom/utils/walks.ts b/packages/runtime/test/utils/walks.ts
similarity index 94%
rename from packages/runtime/test/dom/utils/walks.ts
rename to packages/runtime/test/utils/walks.ts
index a3f2fff7b..f9159dd9b 100644
--- a/packages/runtime/test/dom/utils/walks.ts
+++ b/packages/runtime/test/utils/walks.ts
@@ -1,4 +1,4 @@
-import { WalkCodes, WalkRangeSizes } from "../../../src/dom/walker";
+import { WalkCodes, WalkRangeSizes } from "../../src/dom/walker";
export const get = String.fromCharCode(WalkCodes.Get);
export const before = String.fromCharCode(WalkCodes.Before);