ripple 0.2.152 → 0.2.153

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 (67) hide show
  1. package/README.md +3 -3
  2. package/package.json +5 -5
  3. package/src/compiler/phases/1-parse/index.js +1 -1
  4. package/src/compiler/phases/3-transform/client/index.js +37 -16
  5. package/src/compiler/phases/3-transform/server/index.js +43 -25
  6. package/src/runtime/internal/client/events.js +5 -1
  7. package/src/runtime/internal/client/index.js +2 -1
  8. package/src/runtime/internal/client/render.js +18 -15
  9. package/src/runtime/internal/client/runtime.js +75 -10
  10. package/src/runtime/internal/server/index.js +51 -11
  11. package/src/server/index.js +1 -1
  12. package/tests/client/array/array.derived.test.ripple +61 -33
  13. package/tests/client/array/array.iteration.test.ripple +3 -1
  14. package/tests/client/array/array.mutations.test.ripple +19 -15
  15. package/tests/client/array/array.static.test.ripple +115 -104
  16. package/tests/client/array/array.to-methods.test.ripple +3 -3
  17. package/tests/client/basic/basic.attributes.test.ripple +110 -57
  18. package/tests/client/basic/basic.collections.test.ripple +41 -22
  19. package/tests/client/basic/basic.errors.test.ripple +12 -6
  20. package/tests/client/basic/basic.events.test.ripple +51 -33
  21. package/tests/client/basic/basic.reactivity.test.ripple +120 -56
  22. package/tests/client/basic/basic.rendering.test.ripple +49 -19
  23. package/tests/client/basic/basic.styling.test.ripple +2 -2
  24. package/tests/client/basic/basic.utilities.test.ripple +1 -1
  25. package/tests/client/boundaries.test.ripple +70 -58
  26. package/tests/client/compiler/compiler.assignments.test.ripple +32 -4
  27. package/tests/client/compiler/compiler.attributes.test.ripple +46 -46
  28. package/tests/client/compiler/compiler.basic.test.ripple +18 -15
  29. package/tests/client/compiler/compiler.tracked-access.test.ripple +53 -42
  30. package/tests/client/compiler/compiler.typescript.test.ripple +1 -2
  31. package/tests/client/composite/composite.dynamic-components.test.ripple +6 -6
  32. package/tests/client/composite/composite.generics.test.ripple +39 -36
  33. package/tests/client/composite/composite.props.test.ripple +4 -3
  34. package/tests/client/composite/composite.reactivity.test.ripple +112 -27
  35. package/tests/client/composite/composite.render.test.ripple +9 -8
  36. package/tests/client/computed-properties.test.ripple +24 -24
  37. package/tests/client/context.test.ripple +11 -9
  38. package/tests/client/date.test.ripple +3 -1
  39. package/tests/client/dynamic-elements.test.ripple +103 -78
  40. package/tests/client/for.test.ripple +27 -17
  41. package/tests/client/head.test.ripple +42 -6
  42. package/tests/client/html.test.ripple +42 -32
  43. package/tests/client/input-value.test.ripple +4 -4
  44. package/tests/client/map.test.ripple +140 -141
  45. package/tests/client/media-query.test.ripple +31 -31
  46. package/tests/client/object.test.ripple +148 -112
  47. package/tests/client/portal.test.ripple +29 -15
  48. package/tests/client/ref.test.ripple +9 -3
  49. package/tests/client/set.test.ripple +111 -111
  50. package/tests/client/tracked-expression.test.ripple +16 -17
  51. package/tests/client/url/url.derived.test.ripple +19 -9
  52. package/tests/client/url/url.parsing.test.ripple +24 -8
  53. package/tests/client/url/url.partial-removal.test.ripple +12 -4
  54. package/tests/client/url/url.reactivity.test.ripple +63 -25
  55. package/tests/client/url/url.serialization.test.ripple +18 -6
  56. package/tests/client/url-search-params/url-search-params.derived.test.ripple +10 -6
  57. package/tests/client/url-search-params/url-search-params.iteration.test.ripple +3 -1
  58. package/tests/client/url-search-params/url-search-params.mutation.test.ripple +26 -14
  59. package/tests/client/url-search-params/url-search-params.tracked-url.test.ripple +3 -1
  60. package/tests/server/await.test.ripple +23 -22
  61. package/tests/server/basic.test.ripple +1 -1
  62. package/tests/server/compiler.test.ripple +3 -7
  63. package/tests/server/composite.test.ripple +38 -36
  64. package/tests/server/for.test.ripple +9 -5
  65. package/tests/server/if.test.ripple +1 -1
  66. package/tests/server/streaming-ssr.test.ripple +67 -0
  67. package/types/server.d.ts +5 -4
@@ -12,7 +12,9 @@ describe('for statements in SSR', () => {
12
12
  }
13
13
 
14
14
  const { body } = await render(App);
15
- expect(body).toBe('<div class="Item 1">Item 1</div><div class="Item 2">Item 2</div><div class="Item 3">Item 3</div>');
15
+ expect(body).toBe(
16
+ '<div class="Item 1">Item 1</div><div class="Item 2">Item 2</div><div class="Item 3">Item 3</div>',
17
+ );
16
18
  });
17
19
 
18
20
  it('renders nested for...of loops', async () => {
@@ -20,12 +22,12 @@ describe('for statements in SSR', () => {
20
22
  const groups = [
21
23
  {
22
24
  name: 'Group 1',
23
- items: ['Item 1.1', 'Item 1.2']
25
+ items: ['Item 1.1', 'Item 1.2'],
24
26
  },
25
27
  {
26
28
  name: 'Group 2',
27
- items: ['Item 2.1', 'Item 2.2']
28
- }
29
+ items: ['Item 2.1', 'Item 2.2'],
30
+ },
29
31
  ];
30
32
 
31
33
  for (const group of groups) {
@@ -39,6 +41,8 @@ describe('for statements in SSR', () => {
39
41
  }
40
42
 
41
43
  const { body } = await render(App);
42
- expect(body).toBe('<h1>Group 1</h1><ul><li>Item 1.1</li><li>Item 1.2</li></ul><h1>Group 2</h1><ul><li>Item 2.1</li><li>Item 2.2</li></ul>');
44
+ expect(body).toBe(
45
+ '<h1>Group 1</h1><ul><li>Item 1.1</li><li>Item 1.2</li></ul><h1>Group 2</h1><ul><li>Item 2.1</li><li>Item 2.2</li></ul>',
46
+ );
43
47
  });
44
48
  });
@@ -83,4 +83,4 @@ describe('if statements in SSR', () => {
83
83
  const { body } = await render(App);
84
84
  expect(body).toBe('<div>Outer true, Inner false</div>');
85
85
  });
86
- });
86
+ });
@@ -0,0 +1,67 @@
1
+ import { test } from 'vitest';
2
+ import { renderToStream } from 'ripple/server';
3
+ import { Readable } from 'stream';
4
+
5
+ test('renderToStream renders a simple component', async ({ expect }) => {
6
+ component Basic() {
7
+ <div>{'Hello, streaming SSR!'}</div>
8
+ }
9
+
10
+ const stream = renderToStream(Basic);
11
+
12
+ let result = '';
13
+ await new Promise((resolve) => {
14
+ stream.on('data', (chunk) => {
15
+ result += chunk.toString();
16
+ });
17
+ stream.on('end', resolve);
18
+ });
19
+
20
+ expect(result).toBe('<div>Hello, streaming SSR!</div>');
21
+ });
22
+
23
+ test('renderToStream handles async components', async ({ expect }) => {
24
+ component AsyncComponent() {
25
+ await new Promise((resolve) => setTimeout(resolve, 10));
26
+ <p>{'Async content loaded.'}</p>
27
+ }
28
+
29
+ const stream = renderToStream(AsyncComponent);
30
+
31
+ let result = '';
32
+ await new Promise((resolve) => {
33
+ stream.on('data', (chunk) => {
34
+ result += chunk.toString();
35
+ });
36
+ stream.on('end', resolve);
37
+ });
38
+
39
+ expect(result).toBe('<p>Async content loaded.</p>');
40
+ });
41
+
42
+ test('renderToStream handles await blocks with pending state', async ({ expect }) => {
43
+ component AwaitComponent() {
44
+ let data = 'initial';
45
+ await new Promise((resolve) => setTimeout(() => {
46
+ data = 'resolved';
47
+ resolve('');
48
+ }, 20));
49
+ try {
50
+ <div>{'Data: '}{data}</div>
51
+ } pending {
52
+ <div>{'Loading...'}</div>
53
+ }
54
+ }
55
+
56
+ const stream = renderToStream(AwaitComponent);
57
+
58
+ let result = '';
59
+ await new Promise((resolve) => {
60
+ stream.on('data', (chunk) => {
61
+ result += chunk.toString();
62
+ });
63
+ stream.on('end', resolve);
64
+ });
65
+ console.log(result)
66
+ expect(result).toBe('<div>Loading...</div><div>Data: resolved</div>');
67
+ });
package/types/server.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { Props } from '#public'
1
+ import type { Props } from '#public';
2
+ import type { Readable } from 'node:stream';
2
3
 
3
4
  export interface SSRRenderOutput {
4
5
  head: string;
@@ -21,6 +22,6 @@ export interface SSRRenderResult {
21
22
 
22
23
  export type SSRRender = (component: SSRComponent) => Promise<SSRRenderResult>;
23
24
 
24
- export declare function render(
25
- component: SSRComponent,
26
- ): Promise<SSRRenderResult>;
25
+ export declare function render(component: SSRComponent): Promise<SSRRenderResult>;
26
+
27
+ export declare function renderToStream(component: SSRComponent): Readable;