ripple 0.3.72 → 0.3.76

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 (172) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/package.json +3 -3
  3. package/src/jsx-runtime.d.ts +4 -10
  4. package/src/runtime/dynamic-client.js +33 -0
  5. package/src/runtime/dynamic-server.js +80 -0
  6. package/src/runtime/index-client.js +5 -13
  7. package/src/runtime/index-server.js +2 -0
  8. package/src/runtime/internal/client/blocks.js +6 -27
  9. package/src/runtime/internal/client/composite.js +11 -6
  10. package/src/runtime/internal/client/for.js +80 -5
  11. package/src/runtime/internal/client/index.js +0 -2
  12. package/src/runtime/internal/client/render.js +5 -2
  13. package/src/runtime/internal/client/types.d.ts +0 -10
  14. package/src/runtime/internal/server/index.js +8 -1
  15. package/tests/client/__snapshots__/computed-properties.test.tsrx.snap +8 -0
  16. package/tests/client/__snapshots__/for.test.tsrx.snap +22 -0
  17. package/tests/client/__snapshots__/html.test.tsrx.snap +4 -0
  18. package/tests/client/array/array.copy-within.test.tsrx +19 -19
  19. package/tests/client/array/array.derived.test.tsrx +97 -109
  20. package/tests/client/array/array.iteration.test.tsrx +28 -28
  21. package/tests/client/array/array.mutations.test.tsrx +68 -68
  22. package/tests/client/array/array.static.test.tsrx +82 -92
  23. package/tests/client/array/array.to-methods.test.tsrx +15 -15
  24. package/tests/client/async-suspend.test.tsrx +180 -179
  25. package/tests/client/basic/__snapshots__/basic.attributes.test.tsrx.snap +2 -0
  26. package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +4 -0
  27. package/tests/client/basic/basic.attributes.test.tsrx +273 -317
  28. package/tests/client/basic/basic.collections.test.tsrx +55 -61
  29. package/tests/client/basic/basic.components.test.tsrx +198 -220
  30. package/tests/client/basic/basic.errors.test.tsrx +70 -76
  31. package/tests/client/basic/basic.events.test.tsrx +80 -85
  32. package/tests/client/basic/basic.get-set.test.tsrx +54 -64
  33. package/tests/client/basic/basic.hmr.test.tsrx +15 -19
  34. package/tests/client/basic/basic.reactivity.test.tsrx +121 -135
  35. package/tests/client/basic/basic.rendering.test.tsrx +273 -178
  36. package/tests/client/basic/basic.styling.test.tsrx +16 -14
  37. package/tests/client/basic/basic.utilities.test.tsrx +8 -10
  38. package/tests/client/boundaries.test.tsrx +18 -18
  39. package/tests/client/compiler/compiler.assignments.test.tsrx +77 -76
  40. package/tests/client/compiler/compiler.attributes.test.tsrx +18 -14
  41. package/tests/client/compiler/compiler.basic.test.tsrx +357 -288
  42. package/tests/client/compiler/compiler.regex.test.tsrx +40 -44
  43. package/tests/client/compiler/compiler.tracked-access.test.tsrx +57 -38
  44. package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
  45. package/tests/client/compiler/compiler.typescript.test.tsrx +4 -3
  46. package/tests/client/composite/composite.dynamic-components.test.tsrx +62 -47
  47. package/tests/client/composite/composite.generics.test.tsrx +165 -167
  48. package/tests/client/composite/composite.props.test.tsrx +66 -74
  49. package/tests/client/composite/composite.reactivity.test.tsrx +132 -166
  50. package/tests/client/composite/composite.render.test.tsrx +92 -101
  51. package/tests/client/computed-properties.test.tsrx +14 -18
  52. package/tests/client/context.test.tsrx +14 -18
  53. package/tests/client/css/global-additional-cases.test.tsrx +493 -439
  54. package/tests/client/css/global-advanced-selectors.test.tsrx +169 -153
  55. package/tests/client/css/global-at-rules.test.tsrx +71 -66
  56. package/tests/client/css/global-basic.test.tsrx +105 -98
  57. package/tests/client/css/global-classes-ids.test.tsrx +128 -114
  58. package/tests/client/css/global-combinators.test.tsrx +83 -78
  59. package/tests/client/css/global-complex-nesting.test.tsrx +134 -120
  60. package/tests/client/css/global-edge-cases.test.tsrx +138 -120
  61. package/tests/client/css/global-keyframes.test.tsrx +108 -96
  62. package/tests/client/css/global-nested.test.tsrx +88 -78
  63. package/tests/client/css/global-pseudo.test.tsrx +104 -98
  64. package/tests/client/css/global-scoping.test.tsrx +145 -125
  65. package/tests/client/css/style-identifier.test.tsrx +65 -72
  66. package/tests/client/date.test.tsrx +83 -83
  67. package/tests/client/dynamic-elements.test.tsrx +318 -299
  68. package/tests/client/events.test.tsrx +252 -266
  69. package/tests/client/for.test.tsrx +120 -127
  70. package/tests/client/head.test.tsrx +74 -48
  71. package/tests/client/html.test.tsrx +37 -49
  72. package/tests/client/input-value.test.tsrx +1125 -1354
  73. package/tests/client/lazy-array.test.tsrx +10 -16
  74. package/tests/client/lazy-destructuring.test.tsrx +169 -221
  75. package/tests/client/map.test.tsrx +39 -41
  76. package/tests/client/media-query.test.tsrx +15 -19
  77. package/tests/client/object.test.tsrx +46 -56
  78. package/tests/client/portal.test.tsrx +31 -37
  79. package/tests/client/ref.test.tsrx +173 -193
  80. package/tests/client/return.test.tsrx +62 -37
  81. package/tests/client/set.test.tsrx +33 -33
  82. package/tests/client/svg.test.tsrx +197 -216
  83. package/tests/client/switch.test.tsrx +201 -191
  84. package/tests/client/track-async-hydration.test.tsrx +14 -18
  85. package/tests/client/tracked-index-access.test.tsrx +18 -28
  86. package/tests/client/try.test.tsrx +494 -619
  87. package/tests/client/tsx.test.tsrx +286 -292
  88. package/tests/client/typescript-generics.test.tsrx +121 -129
  89. package/tests/client/url/url.derived.test.tsrx +21 -25
  90. package/tests/client/url/url.parsing.test.tsrx +35 -35
  91. package/tests/client/url/url.partial-removal.test.tsrx +32 -32
  92. package/tests/client/url/url.reactivity.test.tsrx +68 -72
  93. package/tests/client/url/url.serialization.test.tsrx +8 -8
  94. package/tests/client/url-search-params/url-search-params.derived.test.tsrx +21 -27
  95. package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +16 -16
  96. package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +37 -37
  97. package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +56 -60
  98. package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +32 -34
  99. package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +9 -9
  100. package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +10 -10
  101. package/tests/hydration/compiled/client/basic.js +390 -319
  102. package/tests/hydration/compiled/client/composite.js +52 -44
  103. package/tests/hydration/compiled/client/for.js +734 -604
  104. package/tests/hydration/compiled/client/head.js +183 -103
  105. package/tests/hydration/compiled/client/html.js +93 -86
  106. package/tests/hydration/compiled/client/if-children.js +95 -71
  107. package/tests/hydration/compiled/client/if.js +113 -89
  108. package/tests/hydration/compiled/client/mixed-control-flow.js +225 -209
  109. package/tests/hydration/compiled/client/nested-control-flow.js +94 -98
  110. package/tests/hydration/compiled/client/reactivity.js +26 -24
  111. package/tests/hydration/compiled/client/return.js +8 -42
  112. package/tests/hydration/compiled/client/switch.js +208 -173
  113. package/tests/hydration/compiled/client/track-async-serialization.js +176 -128
  114. package/tests/hydration/compiled/client/try.js +29 -21
  115. package/tests/hydration/compiled/server/basic.js +210 -221
  116. package/tests/hydration/compiled/server/composite.js +13 -14
  117. package/tests/hydration/compiled/server/for.js +427 -444
  118. package/tests/hydration/compiled/server/head.js +199 -189
  119. package/tests/hydration/compiled/server/html.js +33 -41
  120. package/tests/hydration/compiled/server/if-children.js +114 -117
  121. package/tests/hydration/compiled/server/if.js +77 -83
  122. package/tests/hydration/compiled/server/mixed-control-flow.js +145 -150
  123. package/tests/hydration/compiled/server/nested-control-flow.js +10 -0
  124. package/tests/hydration/compiled/server/reactivity.js +24 -22
  125. package/tests/hydration/compiled/server/return.js +6 -18
  126. package/tests/hydration/compiled/server/switch.js +179 -176
  127. package/tests/hydration/compiled/server/track-async-serialization.js +88 -70
  128. package/tests/hydration/compiled/server/try.js +31 -35
  129. package/tests/hydration/components/basic.tsrx +216 -258
  130. package/tests/hydration/components/composite.tsrx +32 -42
  131. package/tests/hydration/components/events.tsrx +81 -101
  132. package/tests/hydration/components/for.tsrx +270 -336
  133. package/tests/hydration/components/head.tsrx +43 -39
  134. package/tests/hydration/components/hmr.tsrx +16 -22
  135. package/tests/hydration/components/html-in-template.tsrx +15 -21
  136. package/tests/hydration/components/html.tsrx +442 -526
  137. package/tests/hydration/components/if-children.tsrx +107 -125
  138. package/tests/hydration/components/if.tsrx +68 -90
  139. package/tests/hydration/components/mixed-control-flow.tsrx +65 -72
  140. package/tests/hydration/components/nested-control-flow.tsrx +202 -216
  141. package/tests/hydration/components/portal.tsrx +33 -41
  142. package/tests/hydration/components/reactivity.tsrx +26 -34
  143. package/tests/hydration/components/return.tsrx +4 -6
  144. package/tests/hydration/components/switch.tsrx +73 -78
  145. package/tests/hydration/components/track-async-serialization.tsrx +83 -93
  146. package/tests/hydration/components/try.tsrx +37 -51
  147. package/tests/hydration/switch.test.js +8 -8
  148. package/tests/server/await.test.tsrx +3 -3
  149. package/tests/server/basic.attributes.test.tsrx +117 -162
  150. package/tests/server/basic.components.test.tsrx +164 -194
  151. package/tests/server/basic.test.tsrx +299 -199
  152. package/tests/server/compiler.test.tsrx +142 -72
  153. package/tests/server/composite.props.test.tsrx +54 -58
  154. package/tests/server/composite.test.tsrx +165 -167
  155. package/tests/server/context.test.tsrx +13 -17
  156. package/tests/server/dynamic-elements.test.tsrx +147 -148
  157. package/tests/server/for.test.tsrx +115 -84
  158. package/tests/server/head.test.tsrx +54 -31
  159. package/tests/server/html-nesting-validation.test.tsrx +16 -8
  160. package/tests/server/if.test.tsrx +49 -59
  161. package/tests/server/lazy-destructuring.test.tsrx +288 -366
  162. package/tests/server/return.test.tsrx +58 -36
  163. package/tests/server/streaming-ssr.test.tsrx +4 -4
  164. package/tests/server/style-identifier.test.tsrx +61 -69
  165. package/tests/server/switch.test.tsrx +89 -97
  166. package/tests/server/track-async-serialization.test.tsrx +85 -103
  167. package/tests/server/try.test.tsrx +275 -360
  168. package/tests/utils/ref-types.test.js +72 -0
  169. package/tests/utils/vite-plugin-config.test.js +41 -74
  170. package/types/index.d.ts +29 -4
  171. package/src/runtime/internal/client/compat.js +0 -40
  172. package/tests/utils/compiler-compat-config.test.js +0 -38
@@ -0,0 +1,72 @@
1
+ import ts from 'typescript';
2
+ import { describe, expect, it } from 'vitest';
3
+
4
+ /**
5
+ * @param {string} source
6
+ * @returns {string[]}
7
+ */
8
+ function get_diagnostics(source) {
9
+ const root = process.cwd();
10
+ const file_name = `${root}/packages/ripple/ref-types-test.ts`;
11
+ const options = {
12
+ strict: true,
13
+ target: ts.ScriptTarget.ESNext,
14
+ module: ts.ModuleKind.ESNext,
15
+ moduleResolution: ts.ModuleResolutionKind.Bundler,
16
+ lib: ['lib.esnext.d.ts', 'lib.dom.d.ts'],
17
+ skipLibCheck: true,
18
+ baseUrl: root,
19
+ types: [],
20
+ paths: {
21
+ '@tsrx/core/runtime/ref': ['packages/tsrx/types/runtime/ref.d.ts'],
22
+ '@tsrx/core/types': ['packages/tsrx/types/index.d.ts'],
23
+ '#helpers': ['packages/ripple/src/helpers.d.ts'],
24
+ '#public': ['packages/ripple/types/index.d.ts'],
25
+ ripple: ['packages/ripple/types/index.d.ts'],
26
+ 'ripple/jsx-runtime': ['packages/ripple/src/jsx-runtime.d.ts'],
27
+ },
28
+ };
29
+ const host = ts.createCompilerHost(options);
30
+ const read_file = host.readFile.bind(host);
31
+ const file_exists = host.fileExists.bind(host);
32
+ host.readFile = (name) => (name === file_name ? source : read_file(name));
33
+ host.fileExists = (name) => name === file_name || file_exists(name);
34
+
35
+ const program = ts.createProgram([file_name], options, host);
36
+ return ts
37
+ .getPreEmitDiagnostics(program)
38
+ .map((diagnostic) => ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'));
39
+ }
40
+
41
+ describe('Ripple ref types', () => {
42
+ it('exposes RefValue from the public runtime and JSX runtime type surfaces', () => {
43
+ const diagnostics = get_diagnostics(`
44
+ import type { RefValue } from 'ripple';
45
+ import type { RefValue as JSXRefValue } from 'ripple/jsx-runtime';
46
+
47
+ const callback_ref: RefValue<HTMLInputElement> = (node) => {
48
+ node.focus();
49
+ return () => {};
50
+ };
51
+ const object_ref: RefValue<HTMLInputElement> = { current: null };
52
+ const vue_ref: RefValue<HTMLInputElement> = { value: null };
53
+ const element_ref: RefValue<HTMLInputElement> = document.createElement('input');
54
+ const ref_array: RefValue<HTMLInputElement> = [
55
+ callback_ref,
56
+ object_ref,
57
+ vue_ref,
58
+ element_ref,
59
+ null,
60
+ undefined,
61
+ ];
62
+ const jsx_ref: JSXRefValue<HTMLDivElement> = (node) => {
63
+ node.dataset.ready = 'true';
64
+ };
65
+
66
+ void ref_array;
67
+ void jsx_ref;
68
+ `);
69
+
70
+ expect(diagnostics).toEqual([]);
71
+ });
72
+ });
@@ -1,113 +1,80 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import { RenderRoute, resolveRippleConfig } from '@ripple-ts/vite-plugin';
3
3
 
4
- const fake_compat_factory = Object.assign(
5
- () =>
6
- Object.assign(
7
- {
8
- createComponent() {},
9
- createRoot() {
10
- return () => {};
11
- },
12
- },
13
- {
14
- __ripple_compat__: {
15
- from: '@ripple-ts/compat-react',
16
- factory: 'createReactCompat',
17
- },
18
- },
19
- ),
20
- {
21
- __ripple_compat__: {
22
- from: '@ripple-ts/compat-react',
23
- factory: 'createReactCompat',
24
- },
25
- },
26
- );
27
-
28
4
  describe('vite-plugin-ripple config resolution', () => {
29
- it('preserves compat descriptors and applies defaults', () => {
5
+ it('preserves routes and applies defaults', () => {
6
+ const route = new RenderRoute({
7
+ path: '/',
8
+ entry: '/src/App.tsrx',
9
+ });
30
10
  const config = resolveRippleConfig({
31
11
  router: {
32
- routes: [
33
- new RenderRoute({
34
- path: '/',
35
- entry: '/src/App.tsrx',
36
- }),
37
- ],
38
- },
39
- compat: {
40
- react: {
41
- from: '@ripple-ts/compat-react',
42
- factory: 'createReactCompat',
43
- },
12
+ routes: [route],
44
13
  },
45
14
  });
46
15
 
47
- expect(config.compat).toEqual({
48
- react: {
49
- from: '@ripple-ts/compat-react',
50
- factory: 'createReactCompat',
51
- },
52
- });
16
+ expect(config.router.routes).toEqual([route]);
53
17
  expect(config.middlewares).toEqual([]);
54
18
  expect(config.platform.env).toEqual({});
55
19
  expect(config.server.trustProxy).toBe(false);
20
+ expect(config.rootBoundary).toEqual({});
21
+ expect(config.build.outDir).toBe('dist');
56
22
  });
57
23
 
58
- it('defaults compat to an empty object', () => {
24
+ it('defaults routes to an empty array', () => {
59
25
  const config = resolveRippleConfig({
60
26
  router: {
61
27
  routes: [],
62
28
  },
63
29
  });
64
30
 
65
- expect(config.compat).toEqual({});
31
+ expect(config.router.routes).toEqual([]);
66
32
  });
67
33
 
68
- it('allows compat-only configs without routes', () => {
34
+ it('allows configs without routes', () => {
69
35
  const config = resolveRippleConfig({
70
- compat: {
71
- react: fake_compat_factory,
36
+ middlewares: [() => {}],
37
+ platform: {
38
+ env: {
39
+ API_URL: 'https://example.com',
40
+ },
41
+ },
42
+ server: {
43
+ trustProxy: true,
72
44
  },
73
45
  });
74
46
 
75
47
  expect(config.router.routes).toEqual([]);
76
- expect(config.compat.react).toEqual({
77
- from: '@ripple-ts/compat-react',
78
- factory: 'createReactCompat',
48
+ expect(config.middlewares).toHaveLength(1);
49
+ expect(config.platform.env).toEqual({
50
+ API_URL: 'https://example.com',
79
51
  });
52
+ expect(config.server.trustProxy).toBe(true);
80
53
  });
81
54
 
82
- it('normalizes imported compat factories to descriptors', () => {
55
+ it('preserves build options', () => {
83
56
  const config = resolveRippleConfig({
84
- router: {
85
- routes: [],
86
- },
87
- compat: {
88
- react: fake_compat_factory,
57
+ build: {
58
+ outDir: 'build',
59
+ minify: true,
60
+ target: 'es2022',
89
61
  },
90
62
  });
91
63
 
92
- expect(config.compat.react).toEqual({
93
- from: '@ripple-ts/compat-react',
94
- factory: 'createReactCompat',
64
+ expect(config.build).toEqual({
65
+ outDir: 'build',
66
+ minify: true,
67
+ target: 'es2022',
95
68
  });
96
69
  });
97
70
 
98
- it('normalizes invoked compat entries to descriptors', () => {
99
- const config = resolveRippleConfig({
100
- router: {
101
- routes: [],
102
- },
103
- compat: {
104
- react: fake_compat_factory(),
105
- },
106
- });
107
-
108
- expect(config.compat.react).toEqual({
109
- from: '@ripple-ts/compat-react',
110
- factory: 'createReactCompat',
111
- });
71
+ it('throws for invalid routes', () => {
72
+ expect(() =>
73
+ resolveRippleConfig({
74
+ router: {
75
+ routes: /** @type {any} */ ('/'),
76
+ },
77
+ }),
78
+ ).toThrow('router.routes must be an array');
112
79
  });
113
80
  });
package/types/index.d.ts CHANGED
@@ -1,15 +1,17 @@
1
1
  import type { ExtendedEventOptions } from '@tsrx/core/types';
2
+ export type { RefValue } from '@tsrx/core/runtime/ref';
2
3
  export type { AddEventOptions, AddEventObject, ExtendedEventOptions } from '@tsrx/core/types';
3
4
 
4
- export type Component<T = Record<string, any>> = (props: T) => void;
5
+ export type Component<T = Record<string, any>> = (props: T) => void | TSRXElement;
5
6
 
6
7
  declare const TSRX_ELEMENT: unique symbol;
7
8
  declare const REF_KEY: unique symbol;
8
9
  export type RefKey = typeof REF_KEY;
9
10
 
10
- export type TSRXElement = {
11
+ export type TSRXElement<Tag = any> = {
11
12
  readonly render: Function;
12
13
  readonly [TSRX_ELEMENT]: true;
14
+ readonly __tag?: Tag;
13
15
  };
14
16
 
15
17
  /** Type for implicit children fragments rendered with `{children}`. */
@@ -25,6 +27,29 @@ export function tsrx_element(render: Function): TSRXElement;
25
27
 
26
28
  export function Fragment(props: FragmentProps): TSRXElement;
27
29
 
30
+ type DynamicIntrinsicElements = JSX.IntrinsicElements;
31
+ export type DynamicElementType = keyof DynamicIntrinsicElements | Component<any> | (string & {});
32
+ type UnwrapTracked<T> = T extends Tracked<infer V> ? V : T;
33
+ type DynamicTarget<T> = Exclude<UnwrapTracked<T>, null | undefined | false>;
34
+ type DynamicComponentProps<T> = [T] extends [never]
35
+ ? Props
36
+ : T extends Component<infer P>
37
+ ? Omit<P, 'is'>
38
+ : T extends keyof DynamicIntrinsicElements
39
+ ? DynamicIntrinsicElements[T]
40
+ : Props;
41
+ export type DynamicProps<T> = Expand<
42
+ {
43
+ is: T;
44
+ } & DynamicComponentProps<DynamicTarget<NoInfer<T>>>
45
+ >;
46
+
47
+ export function Dynamic<T>(
48
+ props: {
49
+ is: T;
50
+ } & DynamicComponentProps<DynamicTarget<NoInfer<T>>>,
51
+ ): TSRXElement;
52
+
28
53
  export function mount(
29
54
  component: Component,
30
55
  options: { target: HTMLElement; props?: Record<string, any>; rootBoundary?: RootBoundaryOptions },
@@ -173,8 +198,8 @@ interface TrackedBase<V> {
173
198
  '#v': V;
174
199
  value: V;
175
200
  }
176
- // Augment Tracked to be callable when V is a Component
177
- // This allows <@Something /> to work in JSX when Something is Tracked<Component>
201
+ // Augment Tracked to be callable when V is a Component.
202
+ // This allows tracked component values to continue flowing through JSX checks.
178
203
  interface TrackedCallable<V> {
179
204
  (props: V extends Component<infer P> ? P : never): V extends Component ? void : never;
180
205
  }
@@ -1,40 +0,0 @@
1
- /** @import { CompatApi } from '#client' */
2
-
3
- import { ROOT_BLOCK } from './constants.js';
4
- import { active_block } from './runtime.js';
5
-
6
- /**
7
- * @param {string} kind
8
- * @returns {CompatApi | null}
9
- */
10
- function get_compat_from_root(kind) {
11
- var current = active_block;
12
-
13
- while (current !== null) {
14
- if ((current.f & ROOT_BLOCK) !== 0) {
15
- var api = current.s.compat[kind];
16
-
17
- if (api != null) {
18
- return api;
19
- }
20
- }
21
- current = current.p;
22
- }
23
-
24
- return null;
25
- }
26
-
27
- /**
28
- * @param {string} kind
29
- * @param {Node} node
30
- * @param {() => JSX.Element[]} children_fn
31
- */
32
- export function tsx_compat(kind, node, children_fn) {
33
- var compat = get_compat_from_root(kind);
34
-
35
- if (compat == null) {
36
- throw new Error(`No compat API found for kind "${kind}"`);
37
- }
38
-
39
- compat.createComponent(node, children_fn);
40
- }
@@ -1,38 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { compile } from '@tsrx/ripple';
3
-
4
- const source = `
5
- function App() { return <>
6
- <tsx:react>
7
- <div className="react-content">{'Hello'}</div>
8
- </tsx:react>
9
- </>; }
10
- `;
11
-
12
- describe('compiler tsx compat configuration', () => {
13
- it('allows tsx compat when no compat config is provided', () => {
14
- expect(() =>
15
- compile(source, '/src/App.tsrx', {
16
- mode: 'client',
17
- }),
18
- ).not.toThrow();
19
- });
20
-
21
- it('throws when tsx compat kind is not configured', () => {
22
- expect(() =>
23
- compile(source, '/src/App.tsrx', {
24
- mode: 'client',
25
- compat_kinds: [],
26
- }),
27
- ).toThrow('<tsx:react> requires "react" compat to be configured in ripple.config.ts.');
28
- });
29
-
30
- it('allows tsx compat kinds that are configured', () => {
31
- expect(() =>
32
- compile(source, '/src/App.tsrx', {
33
- mode: 'client',
34
- compat_kinds: ['react'],
35
- }),
36
- ).not.toThrow();
37
- });
38
- });