fix: throw descriptive error if using `createRawSnippet` using custom renderer

pull/18058/head
paoloricciuti 5 months ago
parent c322fdff25
commit 13ae09b861

@ -197,6 +197,12 @@ Failed to hydrate the application
Could not `{@render}` snippet due to the expression being `null` or `undefined`. Consider using optional chaining `{@render snippet?.()}`
```
### invalid_snippet_in_custom_renderer
```
`createRawSnippet` cannot be used with a custom renderer
```
### lifecycle_legacy_only
```

@ -151,6 +151,10 @@ This can happen if you render a hydratable on the client that was not rendered o
> Could not `{@render}` snippet due to the expression being `null` or `undefined`. Consider using optional chaining `{@render snippet?.()}`
## invalid_snippet_in_custom_renderer
> `createRawSnippet` cannot be used with a custom renderer
## lifecycle_legacy_only
> `%name%(...)` cannot be used in runes mode

@ -16,6 +16,7 @@ import { DEV } from 'esm-env';
import { get_first_child, get_next_sibling, insert_before, node_type } from '../operations.js';
import { prevent_snippet_stringification } from '../../../shared/validate.js';
import { BranchManager } from './branches.js';
import { renderer } from '../../custom-renderer/state.js';
/**
* @template {(node: TemplateNode, ...args: any[]) => void} SnippetFn
@ -71,9 +72,11 @@ export function wrap_snippet(component, fn) {
* @returns {Snippet<Params>}
*/
export function createRawSnippet(fn) {
// TODO RENDERER: throw an error for createRawSnippet in a non-browser environment, as it relies on DOM APIs
// @ts-expect-error the types are a lie
return (/** @type {TemplateNode} */ anchor, /** @type {Getters<Params>} */ ...params) => {
if (renderer != null) {
e.invalid_snippet_in_custom_renderer();
}
var snippet = fn(...params);
/** @type {Element} */

@ -361,6 +361,22 @@ export function invalid_snippet() {
}
}
/**
* `createRawSnippet` cannot be used with a custom renderer
* @returns {never}
*/
export function invalid_snippet_in_custom_renderer() {
if (DEV) {
const error = new Error(`invalid_snippet_in_custom_renderer\n\`createRawSnippet\` cannot be used with a custom renderer\nhttps://svelte.dev/e/invalid_snippet_in_custom_renderer`);
error.name = 'Svelte error';
throw error;
} else {
throw new Error(`https://svelte.dev/e/invalid_snippet_in_custom_renderer`);
}
}
/**
* `%name%(...)` cannot be used in runes mode
* @param {string} name

@ -0,0 +1,5 @@
import { test } from '../../test';
export default test({
error: '`createRawSnippet` cannot be used with a custom renderer'
});

@ -0,0 +1,9 @@
<script>
import { createRawSnippet } from 'svelte';
const snippet = createRawSnippet(() => ({
render: () => `<span>hello</span>`
}));
</script>
{@render snippet()}
Loading…
Cancel
Save