ripple 0.3.72 → 0.3.74

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 (165) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/package.json +3 -3
  3. package/src/jsx-runtime.d.ts +2 -8
  4. package/src/runtime/index-client.js +3 -13
  5. package/src/runtime/internal/client/blocks.js +3 -25
  6. package/src/runtime/internal/client/for.js +80 -5
  7. package/src/runtime/internal/client/index.js +0 -2
  8. package/src/runtime/internal/client/types.d.ts +0 -10
  9. package/tests/client/__snapshots__/computed-properties.test.tsrx.snap +8 -0
  10. package/tests/client/__snapshots__/for.test.tsrx.snap +22 -0
  11. package/tests/client/__snapshots__/html.test.tsrx.snap +4 -0
  12. package/tests/client/array/array.copy-within.test.tsrx +19 -19
  13. package/tests/client/array/array.derived.test.tsrx +97 -109
  14. package/tests/client/array/array.iteration.test.tsrx +28 -28
  15. package/tests/client/array/array.mutations.test.tsrx +68 -68
  16. package/tests/client/array/array.static.test.tsrx +82 -92
  17. package/tests/client/array/array.to-methods.test.tsrx +15 -15
  18. package/tests/client/async-suspend.test.tsrx +180 -179
  19. package/tests/client/basic/__snapshots__/basic.attributes.test.tsrx.snap +2 -0
  20. package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +4 -0
  21. package/tests/client/basic/basic.attributes.test.tsrx +273 -317
  22. package/tests/client/basic/basic.collections.test.tsrx +55 -61
  23. package/tests/client/basic/basic.components.test.tsrx +196 -218
  24. package/tests/client/basic/basic.errors.test.tsrx +70 -76
  25. package/tests/client/basic/basic.events.test.tsrx +80 -85
  26. package/tests/client/basic/basic.get-set.test.tsrx +54 -64
  27. package/tests/client/basic/basic.hmr.test.tsrx +15 -19
  28. package/tests/client/basic/basic.reactivity.test.tsrx +121 -135
  29. package/tests/client/basic/basic.rendering.test.tsrx +273 -178
  30. package/tests/client/basic/basic.utilities.test.tsrx +8 -10
  31. package/tests/client/boundaries.test.tsrx +18 -18
  32. package/tests/client/compiler/compiler.assignments.test.tsrx +77 -76
  33. package/tests/client/compiler/compiler.attributes.test.tsrx +18 -14
  34. package/tests/client/compiler/compiler.basic.test.tsrx +357 -288
  35. package/tests/client/compiler/compiler.regex.test.tsrx +40 -44
  36. package/tests/client/compiler/compiler.tracked-access.test.tsrx +57 -38
  37. package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
  38. package/tests/client/compiler/compiler.typescript.test.tsrx +4 -3
  39. package/tests/client/composite/composite.dynamic-components.test.tsrx +41 -44
  40. package/tests/client/composite/composite.generics.test.tsrx +165 -167
  41. package/tests/client/composite/composite.props.test.tsrx +66 -74
  42. package/tests/client/composite/composite.reactivity.test.tsrx +132 -166
  43. package/tests/client/composite/composite.render.test.tsrx +92 -101
  44. package/tests/client/computed-properties.test.tsrx +14 -18
  45. package/tests/client/context.test.tsrx +14 -18
  46. package/tests/client/css/global-additional-cases.test.tsrx +491 -437
  47. package/tests/client/css/global-advanced-selectors.test.tsrx +169 -153
  48. package/tests/client/css/global-at-rules.test.tsrx +71 -66
  49. package/tests/client/css/global-basic.test.tsrx +105 -98
  50. package/tests/client/css/global-classes-ids.test.tsrx +128 -114
  51. package/tests/client/css/global-combinators.test.tsrx +83 -78
  52. package/tests/client/css/global-complex-nesting.test.tsrx +134 -120
  53. package/tests/client/css/global-edge-cases.test.tsrx +138 -120
  54. package/tests/client/css/global-keyframes.test.tsrx +108 -96
  55. package/tests/client/css/global-nested.test.tsrx +88 -78
  56. package/tests/client/css/global-pseudo.test.tsrx +104 -98
  57. package/tests/client/css/global-scoping.test.tsrx +145 -125
  58. package/tests/client/css/style-identifier.test.tsrx +62 -69
  59. package/tests/client/date.test.tsrx +83 -83
  60. package/tests/client/dynamic-elements.test.tsrx +227 -283
  61. package/tests/client/events.test.tsrx +252 -266
  62. package/tests/client/for.test.tsrx +120 -127
  63. package/tests/client/head.test.tsrx +40 -48
  64. package/tests/client/html.test.tsrx +37 -49
  65. package/tests/client/input-value.test.tsrx +1125 -1354
  66. package/tests/client/lazy-array.test.tsrx +10 -16
  67. package/tests/client/lazy-destructuring.test.tsrx +169 -221
  68. package/tests/client/map.test.tsrx +39 -41
  69. package/tests/client/media-query.test.tsrx +15 -19
  70. package/tests/client/object.test.tsrx +46 -56
  71. package/tests/client/portal.test.tsrx +31 -37
  72. package/tests/client/ref.test.tsrx +173 -193
  73. package/tests/client/return.test.tsrx +62 -37
  74. package/tests/client/set.test.tsrx +33 -33
  75. package/tests/client/svg.test.tsrx +195 -215
  76. package/tests/client/switch.test.tsrx +201 -191
  77. package/tests/client/track-async-hydration.test.tsrx +14 -18
  78. package/tests/client/tracked-index-access.test.tsrx +18 -28
  79. package/tests/client/try.test.tsrx +494 -619
  80. package/tests/client/tsx.test.tsrx +286 -292
  81. package/tests/client/typescript-generics.test.tsrx +121 -129
  82. package/tests/client/url/url.derived.test.tsrx +21 -25
  83. package/tests/client/url/url.parsing.test.tsrx +35 -35
  84. package/tests/client/url/url.partial-removal.test.tsrx +32 -32
  85. package/tests/client/url/url.reactivity.test.tsrx +68 -72
  86. package/tests/client/url/url.serialization.test.tsrx +8 -8
  87. package/tests/client/url-search-params/url-search-params.derived.test.tsrx +21 -27
  88. package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +16 -16
  89. package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +37 -37
  90. package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +56 -60
  91. package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +32 -34
  92. package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +9 -9
  93. package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +10 -10
  94. package/tests/hydration/compiled/client/basic.js +390 -319
  95. package/tests/hydration/compiled/client/composite.js +52 -44
  96. package/tests/hydration/compiled/client/for.js +734 -604
  97. package/tests/hydration/compiled/client/head.js +183 -103
  98. package/tests/hydration/compiled/client/html.js +93 -86
  99. package/tests/hydration/compiled/client/if-children.js +95 -71
  100. package/tests/hydration/compiled/client/if.js +113 -89
  101. package/tests/hydration/compiled/client/mixed-control-flow.js +225 -209
  102. package/tests/hydration/compiled/client/nested-control-flow.js +94 -98
  103. package/tests/hydration/compiled/client/reactivity.js +26 -24
  104. package/tests/hydration/compiled/client/return.js +8 -42
  105. package/tests/hydration/compiled/client/switch.js +208 -173
  106. package/tests/hydration/compiled/client/track-async-serialization.js +176 -128
  107. package/tests/hydration/compiled/client/try.js +29 -21
  108. package/tests/hydration/compiled/server/basic.js +210 -221
  109. package/tests/hydration/compiled/server/composite.js +13 -14
  110. package/tests/hydration/compiled/server/for.js +427 -444
  111. package/tests/hydration/compiled/server/head.js +199 -189
  112. package/tests/hydration/compiled/server/html.js +33 -41
  113. package/tests/hydration/compiled/server/if-children.js +114 -117
  114. package/tests/hydration/compiled/server/if.js +77 -83
  115. package/tests/hydration/compiled/server/mixed-control-flow.js +145 -150
  116. package/tests/hydration/compiled/server/nested-control-flow.js +10 -0
  117. package/tests/hydration/compiled/server/reactivity.js +24 -22
  118. package/tests/hydration/compiled/server/return.js +6 -18
  119. package/tests/hydration/compiled/server/switch.js +179 -176
  120. package/tests/hydration/compiled/server/track-async-serialization.js +88 -70
  121. package/tests/hydration/compiled/server/try.js +31 -35
  122. package/tests/hydration/components/basic.tsrx +216 -258
  123. package/tests/hydration/components/composite.tsrx +32 -42
  124. package/tests/hydration/components/events.tsrx +81 -101
  125. package/tests/hydration/components/for.tsrx +270 -336
  126. package/tests/hydration/components/head.tsrx +43 -39
  127. package/tests/hydration/components/hmr.tsrx +16 -22
  128. package/tests/hydration/components/html-in-template.tsrx +15 -21
  129. package/tests/hydration/components/html.tsrx +442 -526
  130. package/tests/hydration/components/if-children.tsrx +107 -125
  131. package/tests/hydration/components/if.tsrx +68 -90
  132. package/tests/hydration/components/mixed-control-flow.tsrx +65 -72
  133. package/tests/hydration/components/nested-control-flow.tsrx +202 -216
  134. package/tests/hydration/components/portal.tsrx +33 -41
  135. package/tests/hydration/components/reactivity.tsrx +26 -34
  136. package/tests/hydration/components/return.tsrx +4 -6
  137. package/tests/hydration/components/switch.tsrx +73 -78
  138. package/tests/hydration/components/track-async-serialization.tsrx +83 -93
  139. package/tests/hydration/components/try.tsrx +37 -51
  140. package/tests/hydration/switch.test.js +8 -8
  141. package/tests/server/await.test.tsrx +3 -3
  142. package/tests/server/basic.attributes.test.tsrx +117 -162
  143. package/tests/server/basic.components.test.tsrx +163 -193
  144. package/tests/server/basic.test.tsrx +298 -198
  145. package/tests/server/compiler.test.tsrx +142 -72
  146. package/tests/server/composite.props.test.tsrx +54 -58
  147. package/tests/server/composite.test.tsrx +165 -167
  148. package/tests/server/context.test.tsrx +13 -17
  149. package/tests/server/dynamic-elements.test.tsrx +103 -135
  150. package/tests/server/for.test.tsrx +115 -84
  151. package/tests/server/head.test.tsrx +31 -31
  152. package/tests/server/html-nesting-validation.test.tsrx +16 -8
  153. package/tests/server/if.test.tsrx +49 -59
  154. package/tests/server/lazy-destructuring.test.tsrx +288 -366
  155. package/tests/server/return.test.tsrx +58 -36
  156. package/tests/server/streaming-ssr.test.tsrx +4 -4
  157. package/tests/server/style-identifier.test.tsrx +58 -66
  158. package/tests/server/switch.test.tsrx +89 -97
  159. package/tests/server/track-async-serialization.test.tsrx +85 -103
  160. package/tests/server/try.test.tsrx +275 -360
  161. package/tests/utils/ref-types.test.js +72 -0
  162. package/tests/utils/vite-plugin-config.test.js +41 -74
  163. package/types/index.d.ts +1 -0
  164. package/src/runtime/internal/client/compat.js +0 -40
  165. 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,4 +1,5 @@
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
5
  export type Component<T = Record<string, any>> = (props: T) => void;
@@ -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
- });