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);