diff --git a/.changeset/cuddly-llamas-arrive.md b/.changeset/cuddly-llamas-arrive.md new file mode 100644 index 000000000000..40942b606c34 --- /dev/null +++ b/.changeset/cuddly-llamas-arrive.md @@ -0,0 +1,5 @@ +--- +'@astrojs/partytown': patch +--- + +Include partytown scripts in SSR manifest diff --git a/packages/astro/test/fixtures/ssr-partytown/astro.config.mjs b/packages/astro/test/fixtures/ssr-partytown/astro.config.mjs new file mode 100644 index 000000000000..ea1fb12db89c --- /dev/null +++ b/packages/astro/test/fixtures/ssr-partytown/astro.config.mjs @@ -0,0 +1,7 @@ +import { defineConfig } from 'astro/config'; +import partytown from '@astrojs/partytown'; + +// https://astro.build/config +export default defineConfig({ + integrations: [partytown()], +}); diff --git a/packages/astro/test/fixtures/ssr-partytown/package.json b/packages/astro/test/fixtures/ssr-partytown/package.json new file mode 100644 index 000000000000..5713e2d1bc46 --- /dev/null +++ b/packages/astro/test/fixtures/ssr-partytown/package.json @@ -0,0 +1,9 @@ +{ + "name": "@test/ssr-partytown", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*", + "@astrojs/partytown": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/ssr-partytown/src/pages/index.astro b/packages/astro/test/fixtures/ssr-partytown/src/pages/index.astro new file mode 100644 index 000000000000..743a9d35afbe --- /dev/null +++ b/packages/astro/test/fixtures/ssr-partytown/src/pages/index.astro @@ -0,0 +1,6 @@ + + testing + +

testing

+ + diff --git a/packages/astro/test/ssr-partytown.test.js b/packages/astro/test/ssr-partytown.test.js new file mode 100644 index 000000000000..5ea2bcde59e9 --- /dev/null +++ b/packages/astro/test/ssr-partytown.test.js @@ -0,0 +1,34 @@ +import { expect } from 'chai'; +import { load as cheerioLoad } from 'cheerio'; +import { loadFixture } from './test-utils.js'; +import testAdapter from './test-adapter.js'; + +describe('Using the Partytown integration in SSR', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/ssr-partytown/', + adapter: testAdapter(), + experimental: { + ssr: true, + }, + }); + await fixture.build(); + }); + + it('Has the scripts in the page', async () => { + const app = await fixture.loadTestAdapterApp(); + const request = new Request('http://example.com/'); + const response = await app.render(request); + const html = await response.text(); + const $ = cheerioLoad(html); + expect($('script')).to.have.a.lengthOf(1); + }); + + it('The partytown scripts are in the manifest', async () => { + const app = await fixture.loadTestAdapterApp(); + expect(app.manifest.assets).to.contain('/~partytown/partytown-sw.js'); + }); +}); diff --git a/packages/integrations/partytown/src/index.ts b/packages/integrations/partytown/src/index.ts index 3d1101f968dd..51343b1691e3 100644 --- a/packages/integrations/partytown/src/index.ts +++ b/packages/integrations/partytown/src/index.ts @@ -1,8 +1,9 @@ import { partytownSnippet } from '@builder.io/partytown/integration'; -import { copyLibFiles } from '@builder.io/partytown/utils'; +import { copyLibFiles, libDirPath } from '@builder.io/partytown/utils'; import type { AstroConfig, AstroIntegration } from 'astro'; import { createRequire } from 'module'; import path from 'path'; +import * as fs from 'fs'; import { fileURLToPath } from 'url'; import sirv from './sirv.js'; const resolve = createRequire(import.meta.url).resolve; @@ -50,6 +51,14 @@ export default function createPlugin(options: PartytownOptions): AstroIntegratio debugDir: false, }); }, + 'astro:build:ssr': async ({ manifest }) => { + const dirpath = libDirPath({ debugDir: false }); + const files = await fs.promises.readdir(dirpath); + for(const file of files) { + if(file === 'debug') continue; + manifest.assets.push(`/~partytown/${file}`) + } + } }, }; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 05c6e0f56d17..5dff00a931b0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1598,6 +1598,14 @@ importers: dependencies: astro: link:../../.. + packages/astro/test/fixtures/ssr-partytown: + specifiers: + '@astrojs/partytown': workspace:* + astro: workspace:* + dependencies: + '@astrojs/partytown': link:../../../../integrations/partytown + astro: link:../../.. + packages/astro/test/fixtures/ssr-scripts: specifiers: '@astrojs/preact': 'workspace:' @@ -8258,11 +8266,6 @@ packages: /debug/3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true dependencies: ms: 2.1.3 dev: false @@ -11184,8 +11187,6 @@ packages: debug: 3.2.7 iconv-lite: 0.4.24 sax: 1.2.4 - transitivePeerDependencies: - - supports-color dev: false /netmask/2.0.2: @@ -11269,8 +11270,6 @@ packages: rimraf: 2.7.1 semver: 5.7.1 tar: 4.4.19 - transitivePeerDependencies: - - supports-color dev: false /node-releases/2.0.5: