diff --git a/server/__tests__/runtime-bundle-scripts.test.ts b/server/__tests__/runtime-bundle-scripts.test.ts index c89bfa0e7..11f325c15 100644 --- a/server/__tests__/runtime-bundle-scripts.test.ts +++ b/server/__tests__/runtime-bundle-scripts.test.ts @@ -86,4 +86,39 @@ describe('buildSiteRuntimeScripts', () => { expect(result.runtimeAssets.scripts[0].format).toBe('classic') expect(result.runtimeAssets.scripts[0].src).toContain('/_instatic/assets/version-1/classic/') }) + + it('minifies module bundles for publish but not for the canvas', async () => { + const page = makeRuntimePage() + const site = makeRuntimeSite(page) + site.files = [{ + id: 'motion', + path: 'scripts/motion.ts', + type: 'script', + content: [ + '// motion setup', + 'const readableName = document.documentElement', + 'readableName.dataset.ready = "yes"', + ].join('\n'), + createdAt: 1, + updatedAt: 1, + }] + site.runtime.scripts = { motion: { ...DEFAULT_SCRIPT_RUNTIME_CONFIG } } + + const build = (target: 'publish' | 'canvas') => buildSiteRuntimeScripts({ + site, + page, + target, + assetBasePath: '/_instatic/assets/version-1/', + }) + const entryContent = (result: Awaited>) => + result.files.find((file) => file.path.includes('entries/'))?.content ?? '' + + const published = entryContent(await build('publish')) + const canvas = entryContent(await build('canvas')) + + expect(published).toContain('dataset.ready="yes"') + expect(published).not.toContain('readableName') + expect(published).not.toContain('// motion setup') + expect(canvas).toContain('readableName') + }) }) diff --git a/server/publish/runtime/bundleScripts.ts b/server/publish/runtime/bundleScripts.ts index 8f513e19f..1394cafcb 100644 --- a/server/publish/runtime/bundleScripts.ts +++ b/server/publish/runtime/bundleScripts.ts @@ -372,6 +372,10 @@ export async function buildSiteRuntimeScripts( format: 'esm', logLevel: 'silent', metafile: true, + // Published bundles carry their npm dependencies (GSAP alone is ~170 kB + // unminified), so publish output is minified. Canvas builds stay + // readable for the inline source maps below. + minify: input.target === 'publish', nodePaths: [ ...( input.dependencyCache?.nodeModulesDir