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.
- package/CHANGELOG.md +116 -0
- package/package.json +3 -3
- package/src/jsx-runtime.d.ts +4 -10
- package/src/runtime/dynamic-client.js +33 -0
- package/src/runtime/dynamic-server.js +80 -0
- package/src/runtime/index-client.js +5 -13
- package/src/runtime/index-server.js +2 -0
- package/src/runtime/internal/client/blocks.js +6 -27
- package/src/runtime/internal/client/composite.js +11 -6
- package/src/runtime/internal/client/for.js +80 -5
- package/src/runtime/internal/client/index.js +0 -2
- package/src/runtime/internal/client/render.js +5 -2
- package/src/runtime/internal/client/types.d.ts +0 -10
- package/src/runtime/internal/server/index.js +8 -1
- package/tests/client/__snapshots__/computed-properties.test.tsrx.snap +8 -0
- package/tests/client/__snapshots__/for.test.tsrx.snap +22 -0
- package/tests/client/__snapshots__/html.test.tsrx.snap +4 -0
- package/tests/client/array/array.copy-within.test.tsrx +19 -19
- package/tests/client/array/array.derived.test.tsrx +97 -109
- package/tests/client/array/array.iteration.test.tsrx +28 -28
- package/tests/client/array/array.mutations.test.tsrx +68 -68
- package/tests/client/array/array.static.test.tsrx +82 -92
- package/tests/client/array/array.to-methods.test.tsrx +15 -15
- package/tests/client/async-suspend.test.tsrx +180 -179
- package/tests/client/basic/__snapshots__/basic.attributes.test.tsrx.snap +2 -0
- package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +4 -0
- package/tests/client/basic/basic.attributes.test.tsrx +273 -317
- package/tests/client/basic/basic.collections.test.tsrx +55 -61
- package/tests/client/basic/basic.components.test.tsrx +198 -220
- package/tests/client/basic/basic.errors.test.tsrx +70 -76
- package/tests/client/basic/basic.events.test.tsrx +80 -85
- package/tests/client/basic/basic.get-set.test.tsrx +54 -64
- package/tests/client/basic/basic.hmr.test.tsrx +15 -19
- package/tests/client/basic/basic.reactivity.test.tsrx +121 -135
- package/tests/client/basic/basic.rendering.test.tsrx +273 -178
- package/tests/client/basic/basic.styling.test.tsrx +16 -14
- package/tests/client/basic/basic.utilities.test.tsrx +8 -10
- package/tests/client/boundaries.test.tsrx +18 -18
- package/tests/client/compiler/compiler.assignments.test.tsrx +77 -76
- package/tests/client/compiler/compiler.attributes.test.tsrx +18 -14
- package/tests/client/compiler/compiler.basic.test.tsrx +357 -288
- package/tests/client/compiler/compiler.regex.test.tsrx +40 -44
- package/tests/client/compiler/compiler.tracked-access.test.tsrx +57 -38
- package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
- package/tests/client/compiler/compiler.typescript.test.tsrx +4 -3
- package/tests/client/composite/composite.dynamic-components.test.tsrx +62 -47
- package/tests/client/composite/composite.generics.test.tsrx +165 -167
- package/tests/client/composite/composite.props.test.tsrx +66 -74
- package/tests/client/composite/composite.reactivity.test.tsrx +132 -166
- package/tests/client/composite/composite.render.test.tsrx +92 -101
- package/tests/client/computed-properties.test.tsrx +14 -18
- package/tests/client/context.test.tsrx +14 -18
- package/tests/client/css/global-additional-cases.test.tsrx +493 -439
- package/tests/client/css/global-advanced-selectors.test.tsrx +169 -153
- package/tests/client/css/global-at-rules.test.tsrx +71 -66
- package/tests/client/css/global-basic.test.tsrx +105 -98
- package/tests/client/css/global-classes-ids.test.tsrx +128 -114
- package/tests/client/css/global-combinators.test.tsrx +83 -78
- package/tests/client/css/global-complex-nesting.test.tsrx +134 -120
- package/tests/client/css/global-edge-cases.test.tsrx +138 -120
- package/tests/client/css/global-keyframes.test.tsrx +108 -96
- package/tests/client/css/global-nested.test.tsrx +88 -78
- package/tests/client/css/global-pseudo.test.tsrx +104 -98
- package/tests/client/css/global-scoping.test.tsrx +145 -125
- package/tests/client/css/style-identifier.test.tsrx +65 -72
- package/tests/client/date.test.tsrx +83 -83
- package/tests/client/dynamic-elements.test.tsrx +318 -299
- package/tests/client/events.test.tsrx +252 -266
- package/tests/client/for.test.tsrx +120 -127
- package/tests/client/head.test.tsrx +74 -48
- package/tests/client/html.test.tsrx +37 -49
- package/tests/client/input-value.test.tsrx +1125 -1354
- package/tests/client/lazy-array.test.tsrx +10 -16
- package/tests/client/lazy-destructuring.test.tsrx +169 -221
- package/tests/client/map.test.tsrx +39 -41
- package/tests/client/media-query.test.tsrx +15 -19
- package/tests/client/object.test.tsrx +46 -56
- package/tests/client/portal.test.tsrx +31 -37
- package/tests/client/ref.test.tsrx +173 -193
- package/tests/client/return.test.tsrx +62 -37
- package/tests/client/set.test.tsrx +33 -33
- package/tests/client/svg.test.tsrx +197 -216
- package/tests/client/switch.test.tsrx +201 -191
- package/tests/client/track-async-hydration.test.tsrx +14 -18
- package/tests/client/tracked-index-access.test.tsrx +18 -28
- package/tests/client/try.test.tsrx +494 -619
- package/tests/client/tsx.test.tsrx +286 -292
- package/tests/client/typescript-generics.test.tsrx +121 -129
- package/tests/client/url/url.derived.test.tsrx +21 -25
- package/tests/client/url/url.parsing.test.tsrx +35 -35
- package/tests/client/url/url.partial-removal.test.tsrx +32 -32
- package/tests/client/url/url.reactivity.test.tsrx +68 -72
- package/tests/client/url/url.serialization.test.tsrx +8 -8
- package/tests/client/url-search-params/url-search-params.derived.test.tsrx +21 -27
- package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +16 -16
- package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +37 -37
- package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +56 -60
- package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +32 -34
- package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +9 -9
- package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +10 -10
- package/tests/hydration/compiled/client/basic.js +390 -319
- package/tests/hydration/compiled/client/composite.js +52 -44
- package/tests/hydration/compiled/client/for.js +734 -604
- package/tests/hydration/compiled/client/head.js +183 -103
- package/tests/hydration/compiled/client/html.js +93 -86
- package/tests/hydration/compiled/client/if-children.js +95 -71
- package/tests/hydration/compiled/client/if.js +113 -89
- package/tests/hydration/compiled/client/mixed-control-flow.js +225 -209
- package/tests/hydration/compiled/client/nested-control-flow.js +94 -98
- package/tests/hydration/compiled/client/reactivity.js +26 -24
- package/tests/hydration/compiled/client/return.js +8 -42
- package/tests/hydration/compiled/client/switch.js +208 -173
- package/tests/hydration/compiled/client/track-async-serialization.js +176 -128
- package/tests/hydration/compiled/client/try.js +29 -21
- package/tests/hydration/compiled/server/basic.js +210 -221
- package/tests/hydration/compiled/server/composite.js +13 -14
- package/tests/hydration/compiled/server/for.js +427 -444
- package/tests/hydration/compiled/server/head.js +199 -189
- package/tests/hydration/compiled/server/html.js +33 -41
- package/tests/hydration/compiled/server/if-children.js +114 -117
- package/tests/hydration/compiled/server/if.js +77 -83
- package/tests/hydration/compiled/server/mixed-control-flow.js +145 -150
- package/tests/hydration/compiled/server/nested-control-flow.js +10 -0
- package/tests/hydration/compiled/server/reactivity.js +24 -22
- package/tests/hydration/compiled/server/return.js +6 -18
- package/tests/hydration/compiled/server/switch.js +179 -176
- package/tests/hydration/compiled/server/track-async-serialization.js +88 -70
- package/tests/hydration/compiled/server/try.js +31 -35
- package/tests/hydration/components/basic.tsrx +216 -258
- package/tests/hydration/components/composite.tsrx +32 -42
- package/tests/hydration/components/events.tsrx +81 -101
- package/tests/hydration/components/for.tsrx +270 -336
- package/tests/hydration/components/head.tsrx +43 -39
- package/tests/hydration/components/hmr.tsrx +16 -22
- package/tests/hydration/components/html-in-template.tsrx +15 -21
- package/tests/hydration/components/html.tsrx +442 -526
- package/tests/hydration/components/if-children.tsrx +107 -125
- package/tests/hydration/components/if.tsrx +68 -90
- package/tests/hydration/components/mixed-control-flow.tsrx +65 -72
- package/tests/hydration/components/nested-control-flow.tsrx +202 -216
- package/tests/hydration/components/portal.tsrx +33 -41
- package/tests/hydration/components/reactivity.tsrx +26 -34
- package/tests/hydration/components/return.tsrx +4 -6
- package/tests/hydration/components/switch.tsrx +73 -78
- package/tests/hydration/components/track-async-serialization.tsrx +83 -93
- package/tests/hydration/components/try.tsrx +37 -51
- package/tests/hydration/switch.test.js +8 -8
- package/tests/server/await.test.tsrx +3 -3
- package/tests/server/basic.attributes.test.tsrx +117 -162
- package/tests/server/basic.components.test.tsrx +164 -194
- package/tests/server/basic.test.tsrx +299 -199
- package/tests/server/compiler.test.tsrx +142 -72
- package/tests/server/composite.props.test.tsrx +54 -58
- package/tests/server/composite.test.tsrx +165 -167
- package/tests/server/context.test.tsrx +13 -17
- package/tests/server/dynamic-elements.test.tsrx +147 -148
- package/tests/server/for.test.tsrx +115 -84
- package/tests/server/head.test.tsrx +54 -31
- package/tests/server/html-nesting-validation.test.tsrx +16 -8
- package/tests/server/if.test.tsrx +49 -59
- package/tests/server/lazy-destructuring.test.tsrx +288 -366
- package/tests/server/return.test.tsrx +58 -36
- package/tests/server/streaming-ssr.test.tsrx +4 -4
- package/tests/server/style-identifier.test.tsrx +61 -69
- package/tests/server/switch.test.tsrx +89 -97
- package/tests/server/track-async-serialization.test.tsrx +85 -103
- package/tests/server/try.test.tsrx +275 -360
- package/tests/utils/ref-types.test.js +72 -0
- package/tests/utils/vite-plugin-config.test.js +41 -74
- package/types/index.d.ts +29 -4
- package/src/runtime/internal/client/compat.js +0 -40
- 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
|
|
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.
|
|
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
|
|
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.
|
|
31
|
+
expect(config.router.routes).toEqual([]);
|
|
66
32
|
});
|
|
67
33
|
|
|
68
|
-
it('allows
|
|
34
|
+
it('allows configs without routes', () => {
|
|
69
35
|
const config = resolveRippleConfig({
|
|
70
|
-
|
|
71
|
-
|
|
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.
|
|
77
|
-
|
|
78
|
-
|
|
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('
|
|
55
|
+
it('preserves build options', () => {
|
|
83
56
|
const config = resolveRippleConfig({
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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.
|
|
93
|
-
|
|
94
|
-
|
|
64
|
+
expect(config.build).toEqual({
|
|
65
|
+
outDir: 'build',
|
|
66
|
+
minify: true,
|
|
67
|
+
target: 'es2022',
|
|
95
68
|
});
|
|
96
69
|
});
|
|
97
70
|
|
|
98
|
-
it('
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
|
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
|
-
});
|