diff --git a/documentation/docs/98-reference/.generated/compile-errors.md b/documentation/docs/98-reference/.generated/compile-errors.md index 43493993b8..c6e2674b88 100644 --- a/documentation/docs/98-reference/.generated/compile-errors.md +++ b/documentation/docs/98-reference/.generated/compile-errors.md @@ -605,6 +605,12 @@ Cannot use `await` in deriveds and template expressions, or at the top level of Imports of `svelte/internal/*` are forbidden. It contains private runtime code which is subject to change without notice. If you're importing from `svelte/internal/*` to work around a limitation of Svelte, please open an issue at https://github.com/sveltejs/svelte and explain your use case ``` +### incompatible_with_custom_renderer + +``` +%message% is not compatible with `customRenderer` +``` + ### inspect_trace_generator ``` diff --git a/packages/svelte/messages/compile-errors/template.md b/packages/svelte/messages/compile-errors/template.md index 6aa4335c11..d53cd9e554 100644 --- a/packages/svelte/messages/compile-errors/template.md +++ b/packages/svelte/messages/compile-errors/template.md @@ -263,6 +263,10 @@ The same applies to components: > `<%name%>` does not support non-event attributes or spread attributes +## incompatible_with_custom_renderer + +> %message% is not compatible with `customRenderer` + ## js_parse_error > %message% diff --git a/packages/svelte/src/compiler/errors.js b/packages/svelte/src/compiler/errors.js index b97879ccee..897013353c 100644 --- a/packages/svelte/src/compiler/errors.js +++ b/packages/svelte/src/compiler/errors.js @@ -1185,6 +1185,16 @@ export function illegal_element_attribute(node, name) { e(node, 'illegal_element_attribute', `\`<${name}>\` does not support non-event attributes or spread attributes\nhttps://svelte.dev/e/illegal_element_attribute`); } +/** + * %message% is not compatible with `customRenderer` + * @param {null | number | NodeLike} node + * @param {string} message + * @returns {never} + */ +export function incompatible_with_custom_renderer(node, message) { + e(node, 'incompatible_with_custom_renderer', `${message} is not compatible with \`customRenderer\`\nhttps://svelte.dev/e/incompatible_with_custom_renderer`); +} + /** * %message% * @param {null | number | NodeLike} node diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteBody.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteBody.js index 82bc592c14..1bd353b689 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteBody.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteBody.js @@ -9,6 +9,10 @@ import { disallow_children } from './shared/special-element.js'; * @param {Context} context */ export function SvelteBody(node, context) { + if (context.state.analysis.custom_renderer) { + e.incompatible_with_custom_renderer(node, '``'); + } + disallow_children(node); for (const attribute of node.attributes) { if ( diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteDocument.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteDocument.js index fe54ebf30d..067a228692 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteDocument.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteDocument.js @@ -9,6 +9,10 @@ import { is_event_attribute } from '../../../utils/ast.js'; * @param {Context} context */ export function SvelteDocument(node, context) { + if (context.state.analysis.custom_renderer) { + e.incompatible_with_custom_renderer(node, '``'); + } + disallow_children(node); for (const attribute of node.attributes) { diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteHead.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteHead.js index 5a3ed44f20..253074e6a7 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteHead.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteHead.js @@ -8,6 +8,10 @@ import { mark_subtree_dynamic } from './shared/fragment.js'; * @param {Context} context */ export function SvelteHead(node, context) { + if (context.state.analysis.custom_renderer) { + e.incompatible_with_custom_renderer(node, '``'); + } + for (const attribute of node.attributes) { e.svelte_head_illegal_attribute(attribute); } diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteWindow.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteWindow.js index 20f5abc5d6..ffaaa45258 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteWindow.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteWindow.js @@ -9,6 +9,10 @@ import { is_event_attribute } from '../../../utils/ast.js'; * @param {Context} context */ export function SvelteWindow(node, context) { + if (context.state.analysis.custom_renderer) { + e.incompatible_with_custom_renderer(node, '``'); + } + disallow_children(node); for (const attribute of node.attributes) { diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-template/index.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-template/index.js index 3dcc8c228a..b81746a0e5 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-template/index.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-template/index.js @@ -51,7 +51,7 @@ export function transform_template(state, namespace, flags = 0) { flags ? b.literal(flags) : undefined ); - if (state.template.contains_script_tag) { + if (state.template.contains_script_tag && !state.analysis.custom_renderer) { call = b.call(`$.with_script`, call); } diff --git a/packages/svelte/src/internal/client/dom/blocks/svelte-head.js b/packages/svelte/src/internal/client/dom/blocks/svelte-head.js index 11c949f083..acdd5fa458 100644 --- a/packages/svelte/src/internal/client/dom/blocks/svelte-head.js +++ b/packages/svelte/src/internal/client/dom/blocks/svelte-head.js @@ -18,7 +18,6 @@ import { COMMENT_NODE, EFFECT_PRESERVED, HEAD_EFFECT } from '#client/constants'; * @returns {void} */ export function head(hash, render_fn) { - // TODO RENDERER: throw in case we are using custom renderers as this rely on the head element // The head function may be called after the first hydration pass and ssr comment nodes may still be present, // therefore we need to skip that when we detect that we're not in hydration mode. let previous_hydrate_node = null; diff --git a/packages/svelte/tests/custom-renderers/samples/svelte-body/_config.js b/packages/svelte/tests/custom-renderers/samples/svelte-body/_config.js new file mode 100644 index 0000000000..0756c1c397 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/svelte-body/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + compile_error: '`` is not compatible with `customRenderer`' +}); diff --git a/packages/svelte/tests/custom-renderers/samples/svelte-body/main.svelte b/packages/svelte/tests/custom-renderers/samples/svelte-body/main.svelte new file mode 100644 index 0000000000..d1377e8ca0 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/svelte-body/main.svelte @@ -0,0 +1 @@ + diff --git a/packages/svelte/tests/custom-renderers/samples/svelte-document/_config.js b/packages/svelte/tests/custom-renderers/samples/svelte-document/_config.js new file mode 100644 index 0000000000..4ec406039a --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/svelte-document/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + compile_error: '`` is not compatible with `customRenderer`' +}); diff --git a/packages/svelte/tests/custom-renderers/samples/svelte-document/main.svelte b/packages/svelte/tests/custom-renderers/samples/svelte-document/main.svelte new file mode 100644 index 0000000000..f0dc6c5633 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/svelte-document/main.svelte @@ -0,0 +1 @@ + diff --git a/packages/svelte/tests/custom-renderers/samples/svelte-head/_config.js b/packages/svelte/tests/custom-renderers/samples/svelte-head/_config.js new file mode 100644 index 0000000000..3a5c5d34cb --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/svelte-head/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + compile_error: '`` is not compatible with `customRenderer`' +}); diff --git a/packages/svelte/tests/custom-renderers/samples/svelte-head/main.svelte b/packages/svelte/tests/custom-renderers/samples/svelte-head/main.svelte new file mode 100644 index 0000000000..cd354a4c07 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/svelte-head/main.svelte @@ -0,0 +1,9 @@ + + + + + diff --git a/packages/svelte/tests/custom-renderers/samples/svelte-window/_config.js b/packages/svelte/tests/custom-renderers/samples/svelte-window/_config.js new file mode 100644 index 0000000000..f84268ca2e --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/svelte-window/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + compile_error: '`` is not compatible with `customRenderer`' +}); diff --git a/packages/svelte/tests/custom-renderers/samples/svelte-window/main.svelte b/packages/svelte/tests/custom-renderers/samples/svelte-window/main.svelte new file mode 100644 index 0000000000..47dd4baa23 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/svelte-window/main.svelte @@ -0,0 +1 @@ +