@yak/react 0.0.0-stage → 10.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +114 -2
- package/dist/context/baseContext.d.ts +5 -0
- package/dist/context/baseContext.js +8 -0
- package/dist/context/baseContext.js.map +1 -0
- package/dist/context/index.d.ts +20 -0
- package/dist/context/index.js +15 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/index.server.d.ts +9 -0
- package/dist/context/index.server.js +17 -0
- package/dist/context/index.server.js.map +1 -0
- package/dist/cross-file-resolver/index.d.ts +199 -0
- package/dist/cross-file-resolver/index.js +569 -0
- package/dist/cross-file-resolver/index.js.map +1 -0
- package/dist/index.d.ts +320 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +452 -0
- package/dist/internal.js +363 -0
- package/dist/internal.js.map +1 -0
- package/dist/isolated-source-eval/index.d.ts +30 -0
- package/dist/isolated-source-eval/index.js +317 -0
- package/dist/isolated-source-eval/index.js.map +1 -0
- package/dist/isolated-source-eval/worker.js +59 -0
- package/dist/isolated-source-eval/worker.js.map +1 -0
- package/dist/jsx-dev-runtime.d.ts +7 -0
- package/dist/jsx-dev-runtime.js +2 -0
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-runtime.d.ts +38 -0
- package/dist/jsx-runtime.js +2 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/loaders/turbo-loader.d.ts +15 -0
- package/dist/loaders/turbo-loader.js +816 -0
- package/dist/loaders/turbo-loader.js.map +1 -0
- package/dist/loaders/vite-plugin.d.ts +103 -0
- package/dist/loaders/vite-plugin.js +885 -0
- package/dist/loaders/vite-plugin.js.map +1 -0
- package/dist/loaders/webpack-loader.d.ts +12 -0
- package/dist/loaders/webpack-loader.js +710 -0
- package/dist/loaders/webpack-loader.js.map +1 -0
- package/dist/rsbuild/index.d.ts +29 -0
- package/dist/rsbuild/index.js +51 -0
- package/dist/rsbuild/index.js.map +1 -0
- package/dist/static/chunk-DK3Fl9T5.js +1 -0
- package/dist/static/index.d.ts +28 -0
- package/dist/static/index.js +2 -0
- package/dist/static/index.js.map +1 -0
- package/dist/withYak/index.d.ts +112 -0
- package/dist/withYak/index.js +171 -0
- package/dist/withYak/index.js.map +1 -0
- package/loaders/lib/resolveCrossFileSelectors.ts +161 -0
- package/loaders/turbo-evaluator.ts +134 -0
- package/loaders/turbo-loader.ts +184 -0
- package/loaders/vite-plugin.ts +28 -0
- package/loaders/webpack-loader.ts +41 -0
- package/package.json +155 -3
- package/rsbuild/index.ts +91 -0
- package/runtime/__tests__/atoms.test.tsx +48 -0
- package/runtime/__tests__/attrs.test.tsx +490 -0
- package/runtime/__tests__/cssLiteral.test.tsx +503 -0
- package/runtime/__tests__/cssProp.test.tsx +392 -0
- package/runtime/__tests__/cssPropTest.tsx +227 -0
- package/runtime/__tests__/foldedJsxParity.test.tsx +117 -0
- package/runtime/__tests__/styled.test.tsx +653 -0
- package/runtime/__tests__/tsconfig.json +18 -0
- package/runtime/__tests__/typeTest.tsx +374 -0
- package/runtime/atoms.tsx +36 -0
- package/runtime/context/README.md +84 -0
- package/runtime/context/baseContext.tsx +5 -0
- package/runtime/context/index.server.tsx +22 -0
- package/runtime/context/index.tsx +36 -0
- package/runtime/cssLiteral.tsx +214 -0
- package/runtime/globalStyle.tsx +54 -0
- package/runtime/index.ts +37 -0
- package/runtime/internal.ts +42 -0
- package/runtime/internals/mergeClassNames.ts +23 -0
- package/runtime/internals/mergeCssProp.ts +69 -0
- package/runtime/internals/propMarkers.ts +20 -0
- package/runtime/internals/unitPostFix.ts +34 -0
- package/runtime/jsx-dev-runtime.ts +6 -0
- package/runtime/jsx-runtime.ts +48 -0
- package/runtime/keyframes.tsx +30 -0
- package/runtime/mocks/cssLiteral.ts +74 -0
- package/runtime/mocks/globalStyle.ts +14 -0
- package/runtime/mocks/keyframes.ts +29 -0
- package/runtime/mocks/styled.ts +8 -0
- package/runtime/publicStyledApi.ts +159 -0
- package/runtime/styled.tsx +372 -0
- package/runtime/styledDom.tsx +139 -0
- package/withYak/allow-global-css.ts +94 -0
- package/withYak/index.ts +268 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
// The SWC plugin folds JSX usages of fully static styled components
|
|
3
|
+
// declared in the same file into plain DOM elements, e.g.
|
|
4
|
+
// `<Card>hi</Card>` becomes `<div className="yX">hi</div>`.
|
|
5
|
+
// These tests verify that the folded output renders the exact same DOM
|
|
6
|
+
// as the runtime wrapper component it replaces.
|
|
7
|
+
import { render } from "@testing-library/react";
|
|
8
|
+
import React from "react";
|
|
9
|
+
import { expect, it } from "vitest";
|
|
10
|
+
import { css as cssFn } from "../cssLiteral";
|
|
11
|
+
import { mergeClassNames } from "../internals/mergeClassNames";
|
|
12
|
+
import { styled as styledFn } from "../styled";
|
|
13
|
+
|
|
14
|
+
// A fully static styled component as compiled by the SWC plugin
|
|
15
|
+
const Card = styledFn("div")("yakClass");
|
|
16
|
+
// A dynamic class-toggling styled component - its usages fold to the
|
|
17
|
+
// inlined condition e.g. <Toggle $active={on} /> becomes
|
|
18
|
+
// <span className={"toggleBase" + (on ? " toggleOn" : "")} />
|
|
19
|
+
const Toggle = styledFn("span")("toggleBase", ({ $active }) => $active && cssFn("toggleOn"));
|
|
20
|
+
// A fully static styled(Component) wrapper - its usages fold to the
|
|
21
|
+
// wrapped component with the static class name
|
|
22
|
+
const Base = (props) => <p {...props} />;
|
|
23
|
+
const Extended = styledFn(Base)("extendedClass");
|
|
24
|
+
const ExtendedCard = styledFn(Card)("extendedCardClass");
|
|
25
|
+
// A styled(Card) chain of same-file static components collapses to a plain
|
|
26
|
+
// element carrying every class, parent-first
|
|
27
|
+
const ExtendedCardTwice = styledFn(ExtendedCard)("extendedTwiceClass");
|
|
28
|
+
|
|
29
|
+
const renderedHtml = (element) => render(element).container.innerHTML;
|
|
30
|
+
// sorted because the runtime puts the incoming className first while the
|
|
31
|
+
// fold puts the static class first - the class names are unique so the
|
|
32
|
+
// order is irrelevant
|
|
33
|
+
const renderedClassNames = (element) => [...render(element).container.firstChild.classList].sort();
|
|
34
|
+
|
|
35
|
+
it("renders the same DOM as a plain usage", () => {
|
|
36
|
+
expect(renderedHtml(<div className="yakClass">hi</div>)).toEqual(renderedHtml(<Card>hi</Card>));
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("renders the same DOM with forwarded attributes", () => {
|
|
40
|
+
const onClick = () => {};
|
|
41
|
+
const forwarded = {
|
|
42
|
+
style: { margin: "1px" },
|
|
43
|
+
onClick,
|
|
44
|
+
"data-x": "1",
|
|
45
|
+
title: "card",
|
|
46
|
+
};
|
|
47
|
+
expect(renderedHtml(<div {...forwarded} className="yakClass" />)).toEqual(
|
|
48
|
+
renderedHtml(<Card {...forwarded} />),
|
|
49
|
+
);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("renders the same class names when merging a className", () => {
|
|
53
|
+
expect(renderedClassNames(<div className={mergeClassNames("yakClass", "user")} />)).toEqual(
|
|
54
|
+
renderedClassNames(<Card className="user" />),
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("ignores falsy class names", () => {
|
|
59
|
+
const active = false;
|
|
60
|
+
expect(renderedHtml(<div className={mergeClassNames("yakClass", active && "active")} />)).toEqual(
|
|
61
|
+
'<div class="yakClass"></div>',
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("renders the same DOM as the wrapped component with the static class", () => {
|
|
66
|
+
expect(renderedHtml(<Base className="extendedClass">hi</Base>)).toEqual(
|
|
67
|
+
renderedHtml(<Extended>hi</Extended>),
|
|
68
|
+
);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("renders the same class names as a wrapped yak component", () => {
|
|
72
|
+
expect(renderedClassNames(<Card className="extendedCardClass">hi</Card>)).toEqual(
|
|
73
|
+
renderedClassNames(<ExtendedCard>hi</ExtendedCard>),
|
|
74
|
+
);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("renders the same class names as a collapsed chain", () => {
|
|
78
|
+
expect(renderedClassNames(<div className="yakClass extendedCardClass">hi</div>)).toEqual(
|
|
79
|
+
renderedClassNames(<ExtendedCard>hi</ExtendedCard>),
|
|
80
|
+
);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("renders the same class names as a collapsed three-level chain", () => {
|
|
84
|
+
expect(
|
|
85
|
+
renderedClassNames(<div className="yakClass extendedCardClass extendedTwiceClass">hi</div>),
|
|
86
|
+
).toEqual(renderedClassNames(<ExtendedCardTwice>hi</ExtendedCardTwice>));
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("merges a className into a collapsed chain", () => {
|
|
90
|
+
expect(renderedClassNames(<div className="yakClass extendedCardClass user" />)).toEqual(
|
|
91
|
+
renderedClassNames(<ExtendedCard className="user" />),
|
|
92
|
+
);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("renders the same DOM as the runtime for inlined $prop conditions", () => {
|
|
96
|
+
// truthy - the class-toggling condition adds the class
|
|
97
|
+
expect(renderedHtml(<span className={"toggleBase" + (true ? " toggleOn" : "")} />)).toEqual(
|
|
98
|
+
renderedHtml(<Toggle $active />),
|
|
99
|
+
);
|
|
100
|
+
// falsy - only the base class remains
|
|
101
|
+
expect(renderedHtml(<span className={"toggleBase" + (false ? " toggleOn" : "")} />)).toEqual(
|
|
102
|
+
renderedHtml(<Toggle $active={false} />),
|
|
103
|
+
);
|
|
104
|
+
// absent $props count as undefined (spreads never fold)
|
|
105
|
+
expect(renderedHtml(<span className={"toggleBase" + (void 0 ? " toggleOn" : "")} />)).toEqual(
|
|
106
|
+
renderedHtml(<Toggle />),
|
|
107
|
+
);
|
|
108
|
+
// the $prop is dropped from the folded element like the runtime strips it
|
|
109
|
+
expect(renderedHtml(<Toggle $active />)).toEqual('<span class="toggleBase toggleOn"></span>');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it("keeps only the static class for undefined class names", () => {
|
|
113
|
+
expect(mergeClassNames("yakClass", undefined)).toBe("yakClass");
|
|
114
|
+
expect(mergeClassNames("yakClass", null)).toBe("yakClass");
|
|
115
|
+
expect(mergeClassNames("yakClass", "")).toBe("yakClass");
|
|
116
|
+
expect(mergeClassNames("yakClass", "user extra")).toBe("yakClass user extra");
|
|
117
|
+
});
|