@yak/react 0.0.0-stage → 10.0.0-rc.0

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.
Files changed (118) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +102 -2
  3. package/dist/context/baseContext.cjs +9 -0
  4. package/dist/context/baseContext.cjs.map +1 -0
  5. package/dist/context/baseContext.d.cts +6 -0
  6. package/dist/context/baseContext.d.ts +6 -0
  7. package/dist/context/baseContext.js +8 -0
  8. package/dist/context/baseContext.js.map +1 -0
  9. package/dist/context/index.cjs +45 -0
  10. package/dist/context/index.cjs.map +1 -0
  11. package/dist/context/index.d.cts +21 -0
  12. package/dist/context/index.d.ts +21 -0
  13. package/dist/context/index.js +15 -0
  14. package/dist/context/index.js.map +1 -0
  15. package/dist/context/index.server.cjs +47 -0
  16. package/dist/context/index.server.cjs.map +1 -0
  17. package/dist/context/index.server.d.cts +10 -0
  18. package/dist/context/index.server.d.ts +10 -0
  19. package/dist/context/index.server.js +17 -0
  20. package/dist/context/index.server.js.map +1 -0
  21. package/dist/cross-file-resolver/index.d.ts +199 -0
  22. package/dist/cross-file-resolver/index.js +535 -0
  23. package/dist/cross-file-resolver/index.js.map +1 -0
  24. package/dist/index.cjs +2 -0
  25. package/dist/index.cjs.map +1 -0
  26. package/dist/index.d.cts +320 -0
  27. package/dist/index.d.ts +320 -0
  28. package/dist/index.js +2 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/internal.cjs +544 -0
  31. package/dist/internal.cjs.map +1 -0
  32. package/dist/internal.d.cts +452 -0
  33. package/dist/internal.d.ts +452 -0
  34. package/dist/internal.js +363 -0
  35. package/dist/internal.js.map +1 -0
  36. package/dist/isolated-source-eval/index.d.ts +30 -0
  37. package/dist/isolated-source-eval/index.js +317 -0
  38. package/dist/isolated-source-eval/index.js.map +1 -0
  39. package/dist/isolated-source-eval/worker.js +59 -0
  40. package/dist/isolated-source-eval/worker.js.map +1 -0
  41. package/dist/jsx-dev-runtime.cjs +2 -0
  42. package/dist/jsx-dev-runtime.cjs.map +1 -0
  43. package/dist/jsx-dev-runtime.d.cts +7 -0
  44. package/dist/jsx-dev-runtime.d.ts +7 -0
  45. package/dist/jsx-dev-runtime.js +2 -0
  46. package/dist/jsx-dev-runtime.js.map +1 -0
  47. package/dist/jsx-runtime.cjs +2 -0
  48. package/dist/jsx-runtime.cjs.map +1 -0
  49. package/dist/jsx-runtime.d.cts +38 -0
  50. package/dist/jsx-runtime.d.ts +38 -0
  51. package/dist/jsx-runtime.js +2 -0
  52. package/dist/jsx-runtime.js.map +1 -0
  53. package/dist/loaders/turbo-loader.cjs +803 -0
  54. package/dist/loaders/turbo-loader.cjs.map +1 -0
  55. package/dist/loaders/turbo-loader.d.cts +15 -0
  56. package/dist/loaders/vite-plugin.d.ts +111 -0
  57. package/dist/loaders/vite-plugin.js +878 -0
  58. package/dist/loaders/vite-plugin.js.map +1 -0
  59. package/dist/loaders/webpack-loader.cjs +697 -0
  60. package/dist/loaders/webpack-loader.cjs.map +1 -0
  61. package/dist/loaders/webpack-loader.d.cts +12 -0
  62. package/dist/rsbuild/index.d.ts +29 -0
  63. package/dist/rsbuild/index.js +52 -0
  64. package/dist/rsbuild/index.js.map +1 -0
  65. package/dist/static/chunk-DK3Fl9T5.js +1 -0
  66. package/dist/static/index.cjs +2 -0
  67. package/dist/static/index.cjs.map +1 -0
  68. package/dist/static/index.d.cts +28 -0
  69. package/dist/static/index.d.ts +28 -0
  70. package/dist/static/index.js +2 -0
  71. package/dist/static/index.js.map +1 -0
  72. package/dist/withYak/index.cjs +208 -0
  73. package/dist/withYak/index.cjs.map +1 -0
  74. package/dist/withYak/index.d.cts +121 -0
  75. package/dist/withYak/index.d.ts +121 -0
  76. package/dist/withYak/index.js +177 -0
  77. package/dist/withYak/index.js.map +1 -0
  78. package/loaders/lib/resolveCrossFileSelectors.ts +162 -0
  79. package/loaders/turbo-evaluator.ts +134 -0
  80. package/loaders/turbo-loader.ts +180 -0
  81. package/loaders/vite-plugin.ts +28 -0
  82. package/loaders/webpack-loader.ts +44 -0
  83. package/package.json +214 -3
  84. package/rsbuild/index.ts +92 -0
  85. package/runtime/__tests__/atoms.test.tsx +48 -0
  86. package/runtime/__tests__/attrs.test.tsx +490 -0
  87. package/runtime/__tests__/cssLiteral.test.tsx +503 -0
  88. package/runtime/__tests__/cssProp.test.tsx +392 -0
  89. package/runtime/__tests__/cssPropTest.tsx +227 -0
  90. package/runtime/__tests__/foldedJsxParity.test.tsx +117 -0
  91. package/runtime/__tests__/styled.test.tsx +653 -0
  92. package/runtime/__tests__/tsconfig.json +18 -0
  93. package/runtime/__tests__/typeTest.tsx +374 -0
  94. package/runtime/atoms.tsx +36 -0
  95. package/runtime/context/README.md +84 -0
  96. package/runtime/context/baseContext.tsx +5 -0
  97. package/runtime/context/index.server.tsx +22 -0
  98. package/runtime/context/index.tsx +36 -0
  99. package/runtime/cssLiteral.tsx +214 -0
  100. package/runtime/globalStyle.tsx +54 -0
  101. package/runtime/index.ts +37 -0
  102. package/runtime/internal.ts +42 -0
  103. package/runtime/internals/mergeClassNames.ts +23 -0
  104. package/runtime/internals/mergeCssProp.ts +69 -0
  105. package/runtime/internals/propMarkers.ts +20 -0
  106. package/runtime/internals/unitPostFix.ts +34 -0
  107. package/runtime/jsx-dev-runtime.ts +6 -0
  108. package/runtime/jsx-runtime.ts +48 -0
  109. package/runtime/keyframes.tsx +30 -0
  110. package/runtime/mocks/cssLiteral.ts +74 -0
  111. package/runtime/mocks/globalStyle.ts +14 -0
  112. package/runtime/mocks/keyframes.ts +29 -0
  113. package/runtime/mocks/styled.ts +8 -0
  114. package/runtime/publicStyledApi.ts +159 -0
  115. package/runtime/styled.tsx +372 -0
  116. package/runtime/styledDom.tsx +139 -0
  117. package/withYak/allow-global-css.ts +94 -0
  118. package/withYak/index.ts +282 -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
+ });