Skip to content

Commit

Permalink
fix: allow embedding two pages generated into the same page in "embed…
Browse files Browse the repository at this point in the history
…ded" mode (#9610)

* added route leaf hash to global init namespace

* changeset

* update changelog message

* revert leaf hash commit

* updated with latest suggestions

* workong on test case

* added int test for two embedded pages inlined into the same page

* Update .changeset/late-toes-cry.md

Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com>

* lint

* delete test html pages

* updated test case

* update lockfile

* simplify embed tests

* remove some unused files

* fix tsconfig

* alphabetize

* prettier

* think i fixed it

---------

Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com>
Co-authored-by: Rich Harris <git@rich-harris.dev>
  • Loading branch information
3 people committed Apr 17, 2023
1 parent 84a5250 commit 367067f
Show file tree
Hide file tree
Showing 16 changed files with 151 additions and 4 deletions.
5 changes: 5 additions & 0 deletions .changeset/late-toes-cry.md
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': patch
---

fix: allow embedding two pages generated into the same page in "embedded" mode
7 changes: 4 additions & 3 deletions packages/kit/src/runtime/server/page/render.js
Expand Up @@ -292,10 +292,9 @@ export async function render_response({
const blocks = [];

const properties = [
`env: ${s(public_env)}`,
paths.assets && `assets: ${s(paths.assets)}`,
`base: ${base_expression}`,
`element: document.currentScript.parentElement`
`env: ${s(public_env)}`
].filter(Boolean);

if (chunks) {
Expand All @@ -318,7 +317,9 @@ export async function render_response({
${properties.join(',\n\t\t\t\t\t\t')}
};`);

const args = [`app`, `${global}.element`];
const args = [`app`, `element`];

blocks.push(`const element = document.currentScript.parentElement;`);

if (page_config.ssr) {
const serialized = { form: 'null', error: 'null' };
Expand Down
2 changes: 2 additions & 0 deletions packages/kit/test/apps/embed/.gitignore
@@ -0,0 +1,2 @@
.custom-out-dir
!.env
23 changes: 23 additions & 0 deletions packages/kit/test/apps/embed/package.json
@@ -0,0 +1,23 @@
{
"name": "test-options",
"private": true,
"version": "0.0.1",
"scripts": {
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
"check": "svelte-kit sync && tsc && svelte-check",
"test": "pnpm test:dev && pnpm test:build",
"test:dev": "cross-env DEV=true playwright test",
"test:build": "playwright test"
},
"devDependencies": {
"@sveltejs/kit": "workspace:^",
"cross-env": "^7.0.3",
"svelte": "^3.56.0",
"svelte-check": "^3.0.2",
"typescript": "^4.9.4",
"vite": "^4.2.0"
},
"type": "module"
}
1 change: 1 addition & 0 deletions packages/kit/test/apps/embed/playwright.config.js
@@ -0,0 +1 @@
export { config as default } from '../../utils.js';
2 changes: 2 additions & 0 deletions packages/kit/test/apps/embed/src/app.html
@@ -0,0 +1,2 @@
%sveltekit.head%
<div>%sveltekit.body%</div>
7 changes: 7 additions & 0 deletions packages/kit/test/apps/embed/src/routes/+layout.svelte
@@ -0,0 +1,7 @@
<script>
import { setup } from '../../../../setup.js';
setup();
</script>

<slot />
7 changes: 7 additions & 0 deletions packages/kit/test/apps/embed/src/routes/embed/+page.js
@@ -0,0 +1,7 @@
/** @type {import('@sveltejs/kit').Load} */
export async function load({ fetch }) {
return {
a: fetch('/embed/a').then((x) => x.text()),
b: fetch('/embed/b').then((x) => x.text())
};
}
6 changes: 6 additions & 0 deletions packages/kit/test/apps/embed/src/routes/embed/+page.svelte
@@ -0,0 +1,6 @@
<script>
export let data;
</script>

{@html data.a}
{@html data.b}
5 changes: 5 additions & 0 deletions packages/kit/test/apps/embed/src/routes/embed/a/+page.svelte
@@ -0,0 +1,5 @@
<script>
import { browser } from '$app/environment';
</script>

<h2 data-testid="a">a ({browser ? 'browser' : 'server'})</h2>
5 changes: 5 additions & 0 deletions packages/kit/test/apps/embed/src/routes/embed/b/+page.svelte
@@ -0,0 +1,5 @@
<script>
import { browser } from '$app/environment';
</script>

<h2 data-testid="b">b ({browser ? 'browser' : 'server'})</h2>
8 changes: 8 additions & 0 deletions packages/kit/test/apps/embed/svelte.config.js
@@ -0,0 +1,8 @@
/** @type {import('@sveltejs/kit').Config} */
const config = {
kit: {
embedded: true
}
};

export default config;
20 changes: 20 additions & 0 deletions packages/kit/test/apps/embed/test/test.js
@@ -0,0 +1,20 @@
import { expect } from '@playwright/test';
import { test } from '../../../utils.js';

/** @typedef {import('@playwright/test').Response} Response */

test.describe.configure({ mode: 'parallel' });

test.describe('embed', () => {
test('serves embedded components in page', async ({ page, javaScriptEnabled }) => {
await page.goto('/embed');

if (javaScriptEnabled) {
expect(await page.textContent('[data-testid="a"]')).toBe('a (browser)');
expect(await page.textContent('[data-testid="b"]')).toBe('b (browser)');
} else {
expect(await page.textContent('[data-testid="a"]')).toBe('a (server)');
expect(await page.textContent('[data-testid="b"]')).toBe('b (server)');
}
});
});
16 changes: 16 additions & 0 deletions packages/kit/test/apps/embed/tsconfig.json
@@ -0,0 +1,16 @@
{
"compilerOptions": {
"allowJs": true,
"checkJs": true,
"esModuleInterop": true,
"noEmit": true,
"paths": {
"@sveltejs/kit": ["../../../types"],
"$lib": ["./src/lib"],
"$lib/*": ["./src/lib/*"],
"types": ["../../../types/internal"]
},
"resolveJsonModule": true
},
"extends": "./.svelte-kit/tsconfig.json"
}
18 changes: 18 additions & 0 deletions packages/kit/test/apps/embed/vite.config.js
@@ -0,0 +1,18 @@
import * as path from 'node:path';
import { sveltekit } from '@sveltejs/kit/vite';

/** @type {import('vite').UserConfig} */
const config = {
build: {
minify: false
},
clearScreen: false,
plugins: [sveltekit()],
server: {
fs: {
allow: [path.resolve('../../../src')]
}
}
};

export default config;
23 changes: 22 additions & 1 deletion pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 367067f

Please sign in to comment.