Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
d012ad1
Version Packages
github-actions[bot] Sep 4, 2025
f6369a0
test: qwik react mount and unmount
sashkashishka Sep 13, 2025
7e2ece2
Merge pull request #7950 from sashkashishka/feature/qwik-react-tests
wmertens Sep 13, 2025
e90e5f8
ci: add qwik react e2e tests run to ci (#7952)
sashkashishka Sep 14, 2025
2abde6f
Merge remote-tracking branch 'origin/main' into v2-merge-main
wmertens Sep 15, 2025
0f4f8c4
fix(ssg): workaround for hanging after ssg
wmertens Aug 15, 2025
d1b2642
Merge pull request #7957 from QwikDev/no-ssg-hang
wmertens Sep 16, 2025
4e39ee7
docs: add plugin@ keyword for search indexing 🔎
gioboa Sep 16, 2025
447bd9d
Merge branch 'main' into fix/5068
gioboa Sep 16, 2025
26cd767
chore(docs examples): prefer signals
wmertens Sep 16, 2025
345b107
fix(ssr): remove non-compliant "type" from placeholder scripts
wmertens Sep 17, 2025
82cc728
docs: fix TOC height 🎨 (#7956)
gioboa Sep 17, 2025
17268f7
docs: move /docs/components docs/core 📦 (#7958)
gioboa Sep 17, 2025
3ec5c8a
docs: prioritize doc search results 📚 (#7959)
gioboa Sep 17, 2025
67e9bd7
Merge pull request #7962 from QwikDev/small-things
wmertens Sep 17, 2025
70a8bea
docs: replace docs/(qwik)/components/ with docs/(qwik)/core/ (#7966)
gioboa Sep 17, 2025
108e7ee
fix(repl): CSS types
wmertens Sep 19, 2025
1f7294a
Merge pull request #7972 from QwikDev/fix-css-properties
wmertens Sep 19, 2025
8a3d755
fix(repl): console logging
wmertens Sep 19, 2025
40989c0
fix(examples): use different SWAPI provider
wmertens Sep 19, 2025
6497a46
Merge pull request #7973 from QwikDev/fix-css-properties
wmertens Sep 19, 2025
3f4a4bc
fix(repl): fix v2 manifest generation due to repl plugins
wmertens Sep 19, 2025
2640557
feat(repl): disable preloader
wmertens Sep 19, 2025
77481be
fix(examples): SWAPI provider with search
wmertens Sep 19, 2025
1ff50b6
fix(tutorial): some fixes
wmertens Sep 19, 2025
6902c40
Merge pull request #7974 from QwikDev/fix-css-properties
wmertens Sep 19, 2025
31b994e
fix(docs): redirect harder
wmertens Sep 19, 2025
30026d9
Merge pull request #7975 from QwikDev/fix-css-properties
wmertens Sep 19, 2025
1ef8eb2
fix: over-preloading due to inaccurate bundle-graph static import graph
maiieul Sep 21, 2025
b5486b2
Revert "fix(docs): redirects"
gioboa Sep 22, 2025
1fd4c61
Merge pull request #7984 from QwikDev/revert-7975-fix-css-properties
wmertens Sep 22, 2025
96b3f8e
chore: changeset
maiieul Sep 22, 2025
b97a62b
chore: bring back Rollup type
maiieul Sep 22, 2025
d9f5de1
chore: add version check code to not show warning on >=4.52
maiieul Sep 22, 2025
854d753
chore: update messages
maiieul Sep 22, 2025
cb3124f
fix(insights app): enable CORS
wmertens Sep 23, 2025
370b604
fix: async
maiieul Sep 23, 2025
9f09d57
Merge pull request #7989 from QwikDev/insignts-cors
wmertens Sep 23, 2025
af161ae
fix(insights app): oopsie on header name
wmertens Sep 23, 2025
21c1003
Merge pull request #7990 from QwikDev/insignts-cors
wmertens Sep 23, 2025
97d27a8
Merge pull request #7897 from QwikDev/changeset-release/upcoming
shairez Sep 23, 2025
d279a5f
Merge branch 'upcoming'
shairez Sep 23, 2025
f03a4ea
added docs-e2e to ignore list in changesets
shairez Sep 23, 2025
e35ee3c
fixed changeset
shairez Sep 24, 2025
76e7f0e
chore: update warn msg
maiieul Sep 24, 2025
bc457c2
fix(qwik-city): correctly handle q-data redirects
wmertens Sep 23, 2025
14b47aa
fix(qwik-city): don't redirect to captive portals when prefetching
wmertens Sep 23, 2025
ec25630
fix(docs): redirect harder
wmertens Sep 19, 2025
9fa4290
chore(qc): extra tests for redirects
wmertens Sep 24, 2025
2657dcc
Merge pull request #7982 from maiieul/fix-manualChunks-merging
wmertens Sep 24, 2025
be79ad2
Merge pull request #7988 from QwikDev/qc-fix-qdata-redirects
wmertens Sep 24, 2025
5c1d116
Merge pull request #7960 from gioboa/fix/5068
wmertens Sep 24, 2025
a5c123a
Merge remote-tracking branch 'origin/build/v2' into v2-merge-main
wmertens Sep 24, 2025
ca2898a
Merge remote-tracking branch 'origin/main' into v2-merge-main
wmertens Sep 25, 2025
658701c
fixup
wmertens Sep 25, 2025
44f96a4
chore: make pnpm happy
wmertens Sep 25, 2025
fdc30ee
chore: fix some peer deps
wmertens Sep 25, 2025
991cec0
fix(serdes): handle cyclic Store deser
wmertens Sep 26, 2025
d66866e
fix(vite): mark core+router as unique; better optimizeDeps discovery
wmertens Sep 26, 2025
6bae2e0
fix(insights app): dev mode crash
wmertens Sep 26, 2025
a97dcf1
chore(ssg): print warning when exiting
wmertens Sep 26, 2025
ceaa368
fix(vite): better dev build error detection
wmertens Sep 26, 2025
c9fc8fe
chore: upgrade vite and vite-imagetools
wmertens Sep 27, 2025
fe448bf
chore(ci): update playwright, show serve output
wmertens Sep 27, 2025
a1d9864
fix: patch rollup getReport() for windows
Varixo Sep 27, 2025
e63dbe6
fix(e2e): reduce flakiness
wmertens Sep 28, 2025
c2a7ef2
chore(e2e): remove e2e. prefixes
wmertens Sep 28, 2025
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/bright-cloths-film.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/core': patch
---

Fix: Better configuration of Vite's optimizeDeps, preventing false duplication warnings, and verifying that Qwik dependencies are not in optimizeDeps.
8 changes: 7 additions & 1 deletion .changeset/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@
"access": "public",
"baseBranch": "origin/build/v2",
"updateInternalDependencies": "minor",
"ignore": ["qwik-docs", "insights", "qwik-cli-e2e", "docs-e2e"],
"ignore": [
"qwik-docs",
"insights",
"qwik-cli-e2e",
"qwik-react-test-app",
"docs-e2e"
],
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
"onlyUpdatePeerDependentsWhenOutOfRange": true
}
Expand Down
5 changes: 5 additions & 0 deletions .changeset/tidy-chefs-tickle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/core': patch
---

fix: During deserialization, stores now correctly handle cyclic references to themselves
12 changes: 8 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -694,6 +694,8 @@ jobs:
mv artifact-create-qwik/* packages/create-qwik/dist/
mkdir -p packages/eslint-plugin-qwik/dist/
mv artifact-eslint-plugin-qwik/* packages/eslint-plugin-qwik/dist/
mkdir -p packages/qwik-react/lib/
mv artifact-qwikreact/lib/* packages/qwik-react/lib/

- run: pnpm install --frozen-lockfile

Expand All @@ -706,10 +708,12 @@ jobs:
- name: Playwright E2E Integration Tests
run: pnpm run test.e2e.integrations.${{ matrix.settings.browser }} --timeout 60000 --retries 7 --workers 1

# RE-ENABBLE THIS AFTER qwik.dev/ packages are published
# - name: Validate Create Qwik Cli
# if: matrix.settings.host != 'windows-latest'
# run: pnpm cli.validate
- name: Playwright E2E Qwik React Tests
run: pnpm run test.e2e.qwik-react.${{ matrix.settings.browser }} --timeout 60000 --retries 7 --workers 1

- name: Validate Create Qwik Cli
if: matrix.settings.host != 'windows-latest'
run: pnpm cli.validate

############ E2E CLI TEST ############
test-cli-e2e:
Expand Down
2 changes: 1 addition & 1 deletion e2e/docs-e2e/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"version": "1.0.0",
"author": "",
"devDependencies": {
"@playwright/test": "1.50.1",
"@playwright/test": "1.54.1",
"@types/node": "24.3.0"
},
"keywords": [],
Expand Down
14 changes: 7 additions & 7 deletions e2e/docs-e2e/tests/Docs/docs-components-pages-load.spec.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
import { test, expect } from '@playwright/test';

test('Components Overview page loads', async ({ page }) => {
await page.goto('/docs/components/overview/');
await page.goto('/docs/core/overview/');
await expect(page).toHaveTitle('Overview | Components 📚 Qwik Documentation');
});

test('Components State page loads', async ({ page }) => {
await page.goto('/docs/components/state/');
await page.goto('/docs/core/state/');
await expect(page).toHaveTitle('State | Components 📚 Qwik Documentation');
});

test('Components Tasks and Lifecycle page loads', async ({ page }) => {
await page.goto('/docs/components/tasks/');
await page.goto('/docs/core/tasks/');
await expect(page).toHaveTitle('Tasks and Lifecycle | Components 📚 Qwik Documentation');
});

test('Components Context page loads', async ({ page }) => {
await page.goto('/docs/components/context/');
await page.goto('/docs/core/context/');
await expect(page).toHaveTitle('Context | Components 📚 Qwik Documentation');
});

test('Components Slots page loads', async ({ page }) => {
await page.goto('/docs/components/slots/');
await page.goto('/docs/core/slots/');
await expect(page).toHaveTitle('Slots | Components 📚 Qwik Documentation');
});

test('Components Rendering page loads', async ({ page }) => {
await page.goto('/docs/components/rendering/');
await page.goto('/docs/core/rendering/');
await expect(page).toHaveTitle('Rendering | Components 📚 Qwik Documentation');
});

test('Components Styles page loads', async ({ page }) => {
await page.goto('/docs/components/styles/');
await page.goto('/docs/core/styles/');
await expect(page).toHaveTitle('Styles | Components 📚 Qwik Documentation');
});

Expand Down
5 changes: 5 additions & 0 deletions e2e/qwik-react-e2e/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
playwright-report
dist
logs
server
tmp
15 changes: 15 additions & 0 deletions e2e/qwik-react-e2e/adapters/express/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 '../../vite.config';

export default extendConfig(baseConfig, () => {
return {
build: {
ssr: true,
rollupOptions: {
input: ['src/entry.express.tsx'],
},
},
plugins: [nodeServerAdapter({ name: 'express' })],
};
});
37 changes: 37 additions & 0 deletions e2e/qwik-react-e2e/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"name": "qwik-react-test-app",
"description": "Qwik react test app",
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"private": true,
"devDependencies": {
"@qwik.dev/react": "workspace:*",
"@types/react": "19.1.13",
"@types/react-dom": "19.1.7",
"react": "19.1.1",
"react-dom": "19.1.1"
},
"scripts": {
"build": "qwik build",
"build.client": "vite build",
"build.preview": "vite build --ssr src/entry.preview.tsx",
"build.server": "vite build -c adapters/express/vite.config.ts",
"build.types": "tsc --incremental --noEmit",
"deploy": "vercel deploy",
"dev": "vite --mode ssr",
"dev.debug": "node --inspect-brk ./node_modules/vite/bin/vite.js --mode ssr --force",
"express": "pnpm build && pnpm serve",
"fmt": "prettier --write .",
"fmt.check": "prettier --check .",
"lint": "eslint \"src/**/*.ts*\"",
"preview": "qwik build preview && vite preview --open",
"qwik": "qwik",
"serve": "node server/entry.express",
"start": "vite --open --mode ssr",
"test": "playwright test",
"test.debug": "playwright test --debug",
"test.ui": "playwright test --ui"
},
"type": "module"
}
48 changes: 48 additions & 0 deletions e2e/qwik-react-e2e/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { defineConfig, devices } from '@playwright/test';

/** See https://playwright.dev/docs/test-configuration. */
export default defineConfig({
testDir: './tests',
fullyParallel: true,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
workers: process.env.CI ? 1 : undefined,
reporter: 'line',

use: {
baseURL: 'http://localhost:3000',
// trace: 'on-first-retry',
// screenshot: 'only-on-failure',

// Increase timeouts for service worker operations
actionTimeout: 10000,
navigationTimeout: 10000,
},

// Increase global timeout for service worker tests
timeout: 30000,

projects: [
{
name: 'chromium',
use: {
...devices['Desktop Chrome'],
},
},
// {
// name: 'firefox',
// use: { ...devices['Desktop Firefox'] },
// },
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},
],

webServer: {
command: 'npm run express',
port: 3000,
stdout: 'pipe',
reuseExistingServer: !process.env.CI,
},
});
28 changes: 28 additions & 0 deletions e2e/qwik-react-e2e/src/components/counter/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/** @jsxImportSource react */
import { useEffect, useState } from 'react';
import { qwikify$ } from '@qwik.dev/react';

interface IProps {
onMount(): void;
onUnmount(): void;
}

function Counter({ onMount, onUnmount }: IProps) {
const [count, setCount] = useState(0);

useEffect(() => {
onMount();
return () => onUnmount();
}, []);

return (
<div data-testid="test-component">
<span data-testid="count">count {count}</span>
<button data-testid="inc-btn" onClick={() => setCount((v) => v + 1)}>
inc
</button>
</div>
);
}

export const QCounter = qwikify$(Counter, { eagerness: 'hover' });
65 changes: 65 additions & 0 deletions e2e/qwik-react-e2e/src/entry.express.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* WHAT IS THIS FILE?
*
* It's the entry point for the Express HTTP server when building for production.
*
* Learn more about Node.js server integrations here:
* - https://qwik.dev/docs/deployments/node/
*
*/
import { createQwikRouter, type PlatformNode } from '@qwik.dev/router/middleware/node';
import 'dotenv/config';
import express from 'express';
import { join } from 'node:path';
import { fileURLToPath } from 'node:url';
import render from './entry.ssr';

declare global {
type QwikRouterPlatform = PlatformNode;
}

// Directories where the static assets are located
const distDir = join(fileURLToPath(import.meta.url), '..', '..', 'dist');
const buildDir = join(distDir, 'build');
const assetsDir = join(distDir, 'assets');

// Allow for dynamic port
const PORT = process.env.PORT ?? 3000;

// Create the Qwik Router Node middleware
const { router, notFound } = createQwikRouter({
render,
// getOrigin(req) {
// // If deploying under a proxy, you may need to build the origin from the request headers
// // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Proto
// const protocol = req.headers["x-forwarded-proto"] ?? "http";
// // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Host
// const host = req.headers["x-forwarded-host"] ?? req.headers.host;
// return `${protocol}://${host}`;
// }
});

// Create the express server
// https://expressjs.com/
const app = express();

// Enable gzip compression
// app.use(compression());

// Static asset handlers
// https://expressjs.com/en/starter/static-files.html
app.use(`/build`, express.static(buildDir, { immutable: true, maxAge: '1y' }));
app.use(`/assets`, express.static(assetsDir, { immutable: true, maxAge: '1y' }));
app.use(express.static(distDir, { redirect: false }));

// Use Qwik Router's page and endpoint request handler
app.use(router);

// Use Qwik Router's 404 handler
app.use(notFound);

// Start the express server
app.listen(PORT, () => {
/* eslint-disable */
console.log(`Server started: http://localhost:${PORT}/`);
});
18 changes: 18 additions & 0 deletions e2e/qwik-react-e2e/src/entry.preview.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* WHAT IS THIS FILE?
*
* It's the bundle entry point for `npm run preview`.
* That is, serving your app built in production mode.
*
* Feel free to modify this file, but don't remove it!
*
* Learn more about Vite's preview command:
* - https://vitejs.dev/config/preview-options.html#preview-options
*
*/
import { createQwikRouter } from '@qwik.dev/router/middleware/node';
// make sure qwikCityPlan is imported before entry
import render from './entry.ssr';

/** The default export is the QwikCity adapter used by Vite preview. */
export default createQwikRouter({ render });
31 changes: 31 additions & 0 deletions e2e/qwik-react-e2e/src/entry.ssr.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/**
* WHAT IS THIS FILE?
*
* SSR renderer function, used by Qwik Router.
*
* Note that this is the only place the Qwik renderer is called. On the client, containers resume
* and do not call render.
*/
import { createRenderer } from '@qwik.dev/router';
import Root from './root';

export default createRenderer((opts) => {
return {
jsx: <Root />,
options: {
...opts,
// Use container attributes to set attributes on the html tag.
containerAttributes: {
lang: 'en-us',
...opts.containerAttributes,
},
serverData: {
...opts.serverData,
// These are the default values for the document head and are overridden by the `head` exports
// documentHead: {
// title: "My App",
// },
},
},
};
});
29 changes: 29 additions & 0 deletions e2e/qwik-react-e2e/src/root.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { component$ } from '@qwik.dev/core';
import { DocumentHeadTags, RouterOutlet, useLocation, useQwikRouter } from '@qwik.dev/router';

export default component$(() => {
useQwikRouter();
const { url } = useLocation();

/**
* This is the root of a QwikRouter site. It contains the document's `<head>` and `<body>`. You
* can adjust them as you see fit.
*/

return (
<>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />

<DocumentHeadTags />

<link rel="canonical" href={url.href} />
</head>
<body>
<RouterOutlet />
</body>
</>
);
});
Loading
Loading