| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599 |
- import { assert } from "chai";
- import { jsx, Fragment, init } from "../../src/index";
- describe("snabbdom", function () {
- describe("jsx", function () {
- it("can be used as a jsxFactory method", function () {
- const vnode = <div title="Hello World">Hello World</div>;
- assert.deepStrictEqual(vnode, {
- sel: "div",
- data: { title: "Hello World" },
- children: undefined,
- elm: undefined,
- text: "Hello World",
- key: undefined,
- });
- });
- it("creates text property for text only child", function () {
- const vnode = <div>foo bar</div>;
- assert.deepStrictEqual(vnode, {
- sel: "div",
- data: {},
- children: undefined,
- elm: undefined,
- text: "foo bar",
- key: undefined,
- });
- });
- it("creates an array of children for multiple children", function () {
- const vnode = (
- <div>
- {"foo"}
- {"bar"}
- </div>
- );
- assert.deepStrictEqual(vnode, {
- sel: "div",
- data: {},
- children: [
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "foo",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "bar",
- key: undefined,
- },
- ],
- elm: undefined,
- text: undefined,
- key: undefined,
- });
- });
- it("flattens children", function () {
- const vnode = (
- <section>
- <h1>A Heading</h1>
- some description
- {["part1", "part2"].map((part) => (
- <span>{part}</span>
- ))}
- </section>
- );
- assert.deepStrictEqual(vnode, {
- sel: "section",
- data: {},
- children: [
- {
- sel: "h1",
- data: {},
- children: undefined,
- elm: undefined,
- text: "A Heading",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "some description",
- key: undefined,
- },
- {
- sel: "span",
- data: {},
- children: undefined,
- elm: undefined,
- text: "part1",
- key: undefined,
- },
- {
- sel: "span",
- data: {},
- children: undefined,
- elm: undefined,
- text: "part2",
- key: undefined,
- },
- ],
- elm: undefined,
- text: undefined,
- key: undefined,
- });
- });
- it("removes falsey children", function () {
- const showLogin = false;
- const showCaptcha = false;
- const loginAttempts = 0;
- const userName = "";
- const profilePic = undefined;
- const isLoggedIn = true;
- const vnode = (
- <div>
- Login Form
- {showLogin && <login-form />}
- {showCaptcha ? <captcha-form /> : null}
- {userName}
- {profilePic}
- Login Attempts: {loginAttempts}
- Logged In: {isLoggedIn}
- </div>
- );
- assert.deepStrictEqual(vnode, {
- sel: "div",
- data: {},
- children: [
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "Login Form",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "Login Attempts: ",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "0",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "Logged In: ",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "true",
- key: undefined,
- },
- ],
- elm: undefined,
- text: undefined,
- key: undefined,
- });
- });
- it("works with a function component", function () {
- // workaround linter issue
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- const Part = ({ part }: { part: string }) => <span>{part}</span>;
- const vnode = (
- <div>
- <a attrs={{ href: "https://github.com/snabbdom/snabbdom" }}>
- Snabbdom
- </a>
- and tsx
- {["work", "like", "a", "charm!"].map((part) => (
- <Part part={part}></Part>
- ))}
- {"💃🕺🎉"}
- </div>
- );
- assert.deepStrictEqual(vnode, {
- sel: "div",
- data: {},
- children: [
- {
- sel: "a",
- data: { attrs: { href: "https://github.com/snabbdom/snabbdom" } },
- children: undefined,
- elm: undefined,
- text: "Snabbdom",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "and tsx",
- key: undefined,
- },
- {
- sel: "span",
- data: {},
- children: undefined,
- elm: undefined,
- text: "work",
- key: undefined,
- },
- {
- sel: "span",
- data: {},
- children: undefined,
- elm: undefined,
- text: "like",
- key: undefined,
- },
- {
- sel: "span",
- data: {},
- children: undefined,
- elm: undefined,
- text: "a",
- key: undefined,
- },
- {
- sel: "span",
- data: {},
- children: undefined,
- elm: undefined,
- text: "charm!",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "💃🕺🎉",
- key: undefined,
- },
- ],
- elm: undefined,
- text: undefined,
- key: undefined,
- });
- });
- });
- describe("Fragment", function () {
- it("can be used as a jsxFragmentFactory method", function () {
- const vnode = <>Hello World</>;
- assert.deepStrictEqual(vnode, {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "Hello World",
- key: undefined,
- });
- });
- it("creates text property for text only child", function () {
- const vnode = <>foo bar</>;
- assert.deepStrictEqual(vnode, {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "foo bar",
- key: undefined,
- });
- });
- it("creates an array of children for multiple children", function () {
- const vnode = (
- <>
- {"foo"}
- {"bar"}
- </>
- );
- assert.deepStrictEqual(vnode, {
- sel: undefined,
- data: {},
- children: [
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "foo",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "bar",
- key: undefined,
- },
- ],
- elm: undefined,
- text: undefined,
- key: undefined,
- });
- });
- it("flattens children", function () {
- const vnode = (
- <>
- <h1>A Heading</h1>
- some description
- {["part1", "part2"].map((part) => (
- <span>{part}</span>
- ))}
- </>
- );
- assert.deepStrictEqual(vnode, {
- sel: undefined,
- data: {},
- children: [
- {
- sel: "h1",
- data: {},
- children: undefined,
- elm: undefined,
- text: "A Heading",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "some description",
- key: undefined,
- },
- {
- sel: "span",
- data: {},
- children: undefined,
- elm: undefined,
- text: "part1",
- key: undefined,
- },
- {
- sel: "span",
- data: {},
- children: undefined,
- elm: undefined,
- text: "part2",
- key: undefined,
- },
- ],
- elm: undefined,
- text: undefined,
- key: undefined,
- });
- });
- it("removes falsey children", function () {
- const showLogin = false;
- const showCaptcha = false;
- const loginAttempts = 0;
- const userName = "";
- const profilePic = undefined;
- const isLoggedIn = true;
- const vnode = (
- <>
- Login Form
- {showLogin && <login-form />}
- {showCaptcha ? <captcha-form /> : null}
- {userName}
- {profilePic}
- Login Attempts: {loginAttempts}
- Logged In: {isLoggedIn}
- </>
- );
- assert.deepStrictEqual(vnode, {
- sel: undefined,
- data: {},
- children: [
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "Login Form",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "Login Attempts: ",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "0",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "Logged In: ",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "true",
- key: undefined,
- },
- ],
- elm: undefined,
- text: undefined,
- key: undefined,
- });
- });
- it("works with a function component", function () {
- // workaround linter issue
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- const Part = ({ part }: { part: string }) => <>{part}</>;
- const vnode = (
- <div>
- <a attrs={{ href: "https://github.com/snabbdom/snabbdom" }}>
- Snabbdom
- </a>
- and tsx
- {["work", "like", "a", "charm!"].map((part) => (
- <Part part={part}></Part>
- ))}
- {"💃🕺🎉"}
- </div>
- );
- assert.deepStrictEqual(vnode, {
- sel: "div",
- data: {},
- children: [
- {
- sel: "a",
- data: { attrs: { href: "https://github.com/snabbdom/snabbdom" } },
- children: undefined,
- elm: undefined,
- text: "Snabbdom",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "and tsx",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "work",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "like",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "a",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "charm!",
- key: undefined,
- },
- {
- sel: undefined,
- data: undefined,
- children: undefined,
- elm: undefined,
- text: "💃🕺🎉",
- key: undefined,
- },
- ],
- elm: undefined,
- text: undefined,
- key: undefined,
- });
- });
- it("can correctly be patched", function () {
- const patch = init([], undefined, {
- experimental: {
- fragments: true,
- },
- });
- const container = document.createElement("div");
- const vnode0 = (
- <>
- <span>Nested </span>
- <>
- children
- <> will be flattened</>
- </>
- </>
- );
- patch(container, vnode0);
- assert.strictEqual(vnode0.elm?.nodeType, document.DOCUMENT_FRAGMENT_NODE);
- assert.strictEqual(
- vnode0.elm?.textContent,
- "Nested children will be flattened"
- );
- const vnode1 = (
- <div>
- <span>Nested </span>
- <>
- child nodes
- {[" will", " be", " patched"]}
- </>
- </div>
- );
- patch(vnode0, vnode1);
- assert.strictEqual((vnode1.elm as HTMLElement).tagName, "DIV");
- assert.strictEqual(
- vnode1.elm?.textContent,
- "Nested child nodes will be patched"
- );
- const vnode2 = (
- <Fragment key="foo">
- And <>fragment again!</>
- </Fragment>
- );
- patch(vnode1, vnode2);
- assert.strictEqual(vnode2.elm?.nodeType, document.DOCUMENT_FRAGMENT_NODE);
- assert.strictEqual(vnode2.elm?.textContent, "And fragment again!");
- });
- });
- });
|