Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/puny-mice-live.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@qwik.dev/router": patch
---

vite build.assetsDir is respected
2 changes: 2 additions & 0 deletions e2e/adapters-e2e/public/robots.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
User-agent: *
Allow: /
3 changes: 3 additions & 0 deletions e2e/adapters-e2e/src/components/click-me/assets/circle.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions e2e/adapters-e2e/src/components/click-me/click-me.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { component$, useSignal } from '@qwik.dev/core';
import circleSvg from './assets/circle.svg?url';

// We need to extract the component to see the bug on 1.5.7
export default component$(() => {
const isOpenSig = useSignal(false);
return (
<>
<img src={circleSvg} />
<button
onClick$={() => {
return (isOpenSig.value = !isOpenSig.value);
Expand Down
6 changes: 6 additions & 0 deletions e2e/adapters-e2e/vite-env.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/// <reference types="vite/client" />

declare module '*.svg?url' {
const src: string;
export default src;
}
3 changes: 3 additions & 0 deletions e2e/adapters-e2e/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ errorOnDuplicatesPkgDeps(devDependencies, dependencies);
export default defineConfig((): UserConfig => {
return {
plugins: [qwikRouter(), qwikVite(), tsconfigPaths({ root: '.' })],
build: {
assetsInlineLimit: 0,
},
// This tells Vite which dependencies to pre-build in dev mode.
optimizeDeps: {
// Put problematic deps that break bundling here, mostly those with binaries.
Expand Down
2 changes: 2 additions & 0 deletions e2e/vite-e2e/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
output/
.work/
72 changes: 72 additions & 0 deletions e2e/vite-e2e/build-variant.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import { execFile } from 'node:child_process';
import { cp, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
import { join } from 'node:path';
import { promisify } from 'node:util';
import {
appTemplateDir,
findVariantBySlug,
outputRootDir,
toClientConfigPath,
toServerConfigPath,
workspaceRootDir,
} from './variants.ts';

const execFileAsync = promisify(execFile);

async function runBuildWithConfig(configPath: string, appDir: string) {
await execFileAsync('pnpm', ['vite', 'build', '-c', configPath], {
cwd: appDir,
env: process.env,
});
}

async function persistBuildOutput(appDir: string, variantDir: string) {
await rm(variantDir, { recursive: true, force: true });
await mkdir(variantDir, { recursive: true });
await cp(join(appDir, 'dist'), join(variantDir, 'dist'), { recursive: true });
await cp(join(appDir, 'server'), join(variantDir, 'server'), { recursive: true });
}

async function buildVariantBySlug(slug: string) {
const variant = findVariantBySlug(slug);
if (!variant) {
throw new Error(`Unknown variant slug: ${slug}`);
}

await mkdir(outputRootDir, { recursive: true });
await mkdir(workspaceRootDir, { recursive: true });

const variantDir = join(outputRootDir, variant.slug);
const workspaceDir = await mkdtemp(join(workspaceRootDir, `${variant.slug}-`));
const appDir = join(workspaceDir, 'app');

try {
await cp(appTemplateDir, appDir, {
recursive: true,
filter: (src) => {
const ignored = ['node_modules', 'dist', 'server', '.vite-e2e'];
return !ignored.some((name) => src.includes(`/${name}`));
},
});

// Keep each workspace scoped uniquely so Qwik's tmp manifest path doesn't conflict in parallel.
const packageJsonPath = join(appDir, 'package.json');
const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));
packageJson.name = `qwik-vite-e2e-${variant.slug}`;
await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');

await runBuildWithConfig(toClientConfigPath(variant), appDir);
await runBuildWithConfig(toServerConfigPath(variant), appDir);
await persistBuildOutput(appDir, variantDir);
} finally {
await rm(workspaceDir, { recursive: true, force: true });
await rm(workspaceRootDir, { recursive: true, force: true });
}
}

const slug = process.argv[2];
if (!slug) {
throw new Error('Missing variant slug argument');
}

await buildVariantBySlug(slug);
12 changes: 12 additions & 0 deletions e2e/vite-e2e/configs/client/assets-dir.vite.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { defineConfig, mergeConfig } from 'vite';
import baseConfig from '../../../adapters-e2e/vite.config';

export default defineConfig(async (env) => {
const resolvedBase = typeof baseConfig === 'function' ? await baseConfig(env) : baseConfig;

return mergeConfig(resolvedBase, {
build: {
assetsDir: 'assets-dir',
},
});
});
13 changes: 13 additions & 0 deletions e2e/vite-e2e/configs/client/base-assets-dir.vite.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { defineConfig, mergeConfig } from 'vite';
import baseConfig from '../../../adapters-e2e/vite.config';

export default defineConfig(async (env) => {
const resolvedBase = typeof baseConfig === 'function' ? await baseConfig(env) : baseConfig;

return mergeConfig(resolvedBase, {
base: '/base/',
build: {
assetsDir: 'assets-dir',
},
});
});
10 changes: 10 additions & 0 deletions e2e/vite-e2e/configs/client/base.vite.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { defineConfig, mergeConfig } from 'vite';
import baseConfig from '../../../adapters-e2e/vite.config';

export default defineConfig(async (env) => {
const resolvedBase = typeof baseConfig === 'function' ? await baseConfig(env) : baseConfig;

return mergeConfig(resolvedBase, {
base: '/base/',
});
});
3 changes: 3 additions & 0 deletions e2e/vite-e2e/configs/client/default.vite.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import baseConfig from '../../../adapters-e2e/vite.config';

export default baseConfig;
15 changes: 15 additions & 0 deletions e2e/vite-e2e/configs/server/assets-dir.vite.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { nodeServerAdapter } from '@qwik.dev/router/adapters/node-server/vite';
import { extendConfig } from '@qwik.dev/router/vite';
import baseConfig from '../client/assets-dir.vite.config';

export default extendConfig(baseConfig, () => {
return {
build: {
ssr: true,
rollupOptions: {
input: ['src/entry.express.tsx'],
},
},
plugins: [nodeServerAdapter({ name: 'express' })],
};
});
15 changes: 15 additions & 0 deletions e2e/vite-e2e/configs/server/base-assets-dir.vite.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { nodeServerAdapter } from '@qwik.dev/router/adapters/node-server/vite';
import { extendConfig } from '@qwik.dev/router/vite';
import baseConfig from '../client/base-assets-dir.vite.config';

export default extendConfig(baseConfig, () => {
return {
build: {
ssr: true,
rollupOptions: {
input: ['src/entry.express.tsx'],
},
},
plugins: [nodeServerAdapter({ name: 'express' })],
};
});
15 changes: 15 additions & 0 deletions e2e/vite-e2e/configs/server/base.vite.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { nodeServerAdapter } from '@qwik.dev/router/adapters/node-server/vite';
import { extendConfig } from '@qwik.dev/router/vite';
import baseConfig from '../client/base.vite.config';

export default extendConfig(baseConfig, () => {
return {
build: {
ssr: true,
rollupOptions: {
input: ['src/entry.express.tsx'],
},
},
plugins: [nodeServerAdapter({ name: 'express' })],
};
});
15 changes: 15 additions & 0 deletions e2e/vite-e2e/configs/server/default.vite.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { nodeServerAdapter } from '@qwik.dev/router/adapters/node-server/vite';
import { extendConfig } from '@qwik.dev/router/vite';
import baseConfig from '../client/default.vite.config';

export default extendConfig(baseConfig, () => {
return {
build: {
ssr: true,
rollupOptions: {
input: ['src/entry.express.tsx'],
},
},
plugins: [nodeServerAdapter({ name: 'express' })],
};
});
44 changes: 44 additions & 0 deletions e2e/vite-e2e/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { defineConfig } from '@playwright/test';
import { join } from 'node:path';
import { variants } from './variants';

export default defineConfig({
testDir: './tests',
fullyParallel: true,
reporter: 'line',
workers: process.env.CI ? 1 : undefined,
timeout: process.env.CI ? 60000 : 30000,
use: {
actionTimeout: 10000,
},
projects: variants.map((variant) => ({
name: variant.slug,
use: {
baseURL: `http://127.0.0.1:${variant.port}`,
},
})),
webServer: variants.map((variant) => ({
command: `node --experimental-strip-types ${join(
process.cwd(),
'e2e',
'vite-e2e',
'build-variant.ts'
)} ${variant.slug} && node ${join(
process.cwd(),
'e2e',
'vite-e2e',
'output',
variant.slug,
'server',
'entry.express.js'
)}`,
port: variant.port,
stdout: 'pipe',
reuseExistingServer: !process.env.CI,
timeout: process.env.CI ? 120000 : 60000,
env: {
...process.env,
PORT: String(variant.port),
},
})),
});
Loading
Loading