@qwik.dev/core 2.0.0-beta.2 → 2.0.0-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/bindings/qwik.darwin-arm64.node +0 -0
  2. package/bindings/qwik.linux-x64-gnu.node +0 -0
  3. package/bindings/qwik.win32-x64-msvc.node +0 -0
  4. package/bindings/qwik_wasm_bg.wasm +0 -0
  5. package/dist/backpatch/index.d.ts +2 -0
  6. package/dist/backpatch/index.mjs +5 -0
  7. package/dist/backpatch/package.json +8 -0
  8. package/dist/backpatch-executor.debug.js +39 -0
  9. package/dist/backpatch-executor.js +1 -0
  10. package/dist/build/package.json +1 -1
  11. package/dist/cli.mjs +5633 -0
  12. package/dist/core-internal.d.ts +673 -396
  13. package/dist/core.min.mjs +2 -1
  14. package/dist/core.mjs +10168 -8294
  15. package/dist/core.mjs.map +1 -1
  16. package/dist/core.prod.mjs +5745 -4592
  17. package/dist/insights/vite/index.mjs +10 -10
  18. package/dist/loader/index.mjs +2 -2
  19. package/dist/loader/package.json +1 -1
  20. package/dist/optimizer.d.ts +16 -38
  21. package/dist/optimizer.mjs +2608 -3719
  22. package/dist/preloader.mjs +8 -11
  23. package/dist/qwikloader.debug.js +152 -132
  24. package/dist/qwikloader.js +1 -1
  25. package/dist/server.d.ts +38 -15
  26. package/dist/server.mjs +1209 -927
  27. package/dist/starters/adapters/aws-lambda/adapters/aws-lambda/{vite.config.mts → vite.config.ts} +2 -2
  28. package/dist/starters/adapters/aws-lambda/package.json +3 -2
  29. package/dist/starters/adapters/aws-lambda/src/entry_aws-lambda.tsx +2 -6
  30. package/dist/starters/adapters/azure-swa/adapters/azure-swa/{vite.config.mts → vite.config.ts} +2 -2
  31. package/dist/starters/adapters/azure-swa/package.json +3 -2
  32. package/dist/starters/adapters/azure-swa/src/entry.azure-swa.tsx +2 -3
  33. package/dist/starters/adapters/bun/adapters/bun/{vite.config.mts → vite.config.ts} +3 -3
  34. package/dist/starters/adapters/bun/package.json +3 -2
  35. package/dist/starters/adapters/bun/src/entry.bun.ts +0 -2
  36. package/dist/starters/adapters/cloud-run/adapters/cloud-run/{vite.config.mts → vite.config.ts} +2 -2
  37. package/dist/starters/adapters/cloud-run/package.json +3 -2
  38. package/dist/starters/adapters/cloud-run/src/entry.cloud-run.tsx +1 -3
  39. package/dist/starters/adapters/cloudflare-pages/adapters/cloudflare-pages/{vite.config.mts → vite.config.ts} +2 -2
  40. package/dist/starters/adapters/cloudflare-pages/package.json +3 -2
  41. package/dist/starters/adapters/cloudflare-pages/src/entry.cloudflare-pages.tsx +2 -3
  42. package/dist/starters/adapters/cloudflare-workers/README.md +52 -0
  43. package/dist/starters/adapters/cloudflare-workers/adapters/cloudflare-workers/vite.config.ts +15 -0
  44. package/dist/starters/adapters/cloudflare-workers/gitignore +3 -0
  45. package/dist/starters/adapters/cloudflare-workers/package.json +31 -0
  46. package/dist/starters/adapters/cloudflare-workers/public/.assetsignore +4 -0
  47. package/dist/starters/adapters/cloudflare-workers/public/_headers +11 -0
  48. package/dist/starters/adapters/cloudflare-workers/public/_redirects +1 -0
  49. package/dist/starters/adapters/cloudflare-workers/src/entry.cloudflare-pages.tsx +23 -0
  50. package/dist/starters/adapters/cloudflare-workers/worker-configuration.d.ts +5 -0
  51. package/dist/starters/adapters/cloudflare-workers/wrangler.jsonc +41 -0
  52. package/dist/starters/adapters/deno/adapters/deno/{vite.config.mts → vite.config.ts} +2 -2
  53. package/dist/starters/adapters/deno/package.json +3 -2
  54. package/dist/starters/adapters/deno/src/entry.deno.ts +0 -2
  55. package/dist/starters/adapters/express/adapters/express/{vite.config.mts → vite.config.ts} +2 -2
  56. package/dist/starters/adapters/express/package.json +4 -3
  57. package/dist/starters/adapters/express/src/entry.express.tsx +1 -3
  58. package/dist/starters/adapters/fastify/adapters/fastify/{vite.config.mts → vite.config.ts} +2 -2
  59. package/dist/starters/adapters/fastify/package.json +3 -2
  60. package/dist/starters/adapters/fastify/src/entry.fastify.tsx +1 -1
  61. package/dist/starters/adapters/fastify/src/plugins/fastify-qwik.ts +1 -2
  62. package/dist/starters/adapters/firebase/adapters/firebase/{vite.config.mts → vite.config.ts} +2 -2
  63. package/dist/starters/adapters/firebase/package.json +3 -2
  64. package/dist/starters/adapters/firebase/src/entry-firebase.tsx +2 -3
  65. package/dist/starters/adapters/netlify-edge/adapters/netlify-edge/{vite.config.mts → vite.config.ts} +2 -2
  66. package/dist/starters/adapters/netlify-edge/package.json +3 -2
  67. package/dist/starters/adapters/netlify-edge/src/entry.netlify-edge.tsx +2 -3
  68. package/dist/starters/adapters/node-server/adapters/node-server/{vite.config.mts → vite.config.ts} +2 -2
  69. package/dist/starters/adapters/node-server/package.json +3 -2
  70. package/dist/starters/adapters/node-server/src/entry.node-server.tsx +0 -2
  71. package/dist/starters/adapters/{static/adapters/static/vite.config.mts → ssg/adapters/ssg/vite.config.ts} +3 -3
  72. package/dist/starters/adapters/ssg/package.json +20 -0
  73. package/dist/starters/adapters/vercel-edge/README.md +2 -2
  74. package/dist/starters/adapters/vercel-edge/adapters/vercel-edge/{vite.config.mts → vite.config.ts} +2 -2
  75. package/dist/starters/adapters/vercel-edge/package.json +3 -2
  76. package/dist/starters/adapters/vercel-edge/src/entry.vercel-edge.tsx +2 -3
  77. package/dist/starters/adapters/vercel-edge/vercel.json +1 -1
  78. package/dist/starters/features/auth/package.json +1 -1
  79. package/dist/starters/features/compiled-i18n/package.json +37 -0
  80. package/dist/starters/features/compiled-i18n/src/components/locale-selector/locale-selector.tsx +30 -0
  81. package/dist/starters/features/compiled-i18n/src/entry.ssr.tsx +31 -0
  82. package/dist/starters/features/compiled-i18n/src/routes/plugin@compiled-i18n.ts +28 -0
  83. package/dist/starters/features/csr/index.html +23 -0
  84. package/dist/starters/features/csr/package.json +29 -0
  85. package/dist/starters/features/csr/src/root.tsx +15 -0
  86. package/dist/starters/features/csr/vite.config.ts +13 -0
  87. package/dist/starters/features/cypress/src/actions/example.action.ts +5 -0
  88. package/dist/starters/features/cypress/src/components/example/example.cy.tsx +50 -8
  89. package/dist/starters/features/cypress/src/components/example/example.tsx +13 -3
  90. package/dist/starters/features/cypress/src/loaders/example.loader.ts +5 -0
  91. package/dist/starters/features/pandacss/package.json +1 -1
  92. package/dist/starters/features/playwright/playwright-report/index.html +953 -930
  93. package/dist/starters/features/postcss/postcss.config.js +1 -1
  94. package/dist/starters/features/storybook/.storybook/tsconfig.json +0 -1
  95. package/dist/starters/features/styled-vanilla-extract/package.json +2 -1
  96. package/dist/starters/features/tailwind/package.json +2 -2
  97. package/dist/starters/features/tailwind/prettier.config.js +10 -0
  98. package/dist/starters/features/tailwind-v3/package.json +1 -1
  99. package/dist/starters/features/tailwind-v3/prettier.config.js +10 -0
  100. package/dist/testing/index.d.ts +775 -6
  101. package/dist/testing/index.mjs +14298 -10837
  102. package/dist/testing/package.json +1 -1
  103. package/handlers.mjs +1 -1
  104. package/package.json +30 -55
  105. package/public.d.ts +3 -1
  106. package/{qwik-cli.cjs → qwik-cli.mjs} +1 -1
  107. package/server.d.ts +2 -0
  108. package/bindings/qwik.darwin-x64.node +0 -0
  109. package/bindings/qwik.wasm.cjs +0 -471
  110. package/dist/build/index.cjs +0 -35
  111. package/dist/build/index.cjs.map +0 -7
  112. package/dist/build/index.dev.cjs +0 -37
  113. package/dist/build/index.dev.cjs.map +0 -7
  114. package/dist/build/index.prod.cjs +0 -37
  115. package/dist/build/index.prod.cjs.map +0 -7
  116. package/dist/cli.cjs +0 -5545
  117. package/dist/core.cjs +0 -11754
  118. package/dist/core.cjs.map +0 -1
  119. package/dist/core.prod.cjs +0 -5647
  120. package/dist/insights/index.qwik.cjs +0 -1
  121. package/dist/insights/vite/index.cjs +0 -1
  122. package/dist/loader/index.cjs +0 -4
  123. package/dist/optimizer.cjs +0 -4020
  124. package/dist/preloader.cjs +0 -269
  125. package/dist/server.cjs +0 -3027
  126. package/dist/starters/adapters/static/package.json +0 -19
  127. package/dist/starters/features/localize/package.json +0 -37
  128. package/dist/starters/features/localize/src/entry.ssr.tsx +0 -30
  129. package/dist/starters/features/localize/src/locales/message.en.json +0 -8
  130. package/dist/starters/features/localize/src/locales/message.it.json +0 -8
  131. package/dist/starters/features/localize/src/routes/[locale]/i18n-utils.ts +0 -94
  132. package/dist/starters/features/localize/src/routes/[locale]/index.tsx +0 -52
  133. package/dist/starters/features/localize/src/routes/[locale]/layout.tsx +0 -12
  134. package/dist/starters/features/tailwind/.prettierrc.js +0 -3
  135. package/dist/testing/index.cjs +0 -33287
  136. /package/dist/starters/adapters/{static → ssg}/README.md +0 -0
@@ -1,5 +1,4 @@
1
1
  import fastifyStatic from "@fastify/static";
2
- import qwikRouterConfig from "@qwik-router-config";
3
2
  import { createQwikRouter } from "@qwik.dev/router/middleware/node";
4
3
  import type { FastifyPluginAsync } from "fastify";
5
4
  import fastifyPlugin from "fastify-plugin";
@@ -12,7 +11,7 @@ export interface FastifyQwikOptions {
12
11
  assetsDir: string;
13
12
  }
14
13
 
15
- const { router, notFound } = createQwikRouter({ render, qwikRouterConfig });
14
+ const { router, notFound } = createQwikRouter({ render });
16
15
 
17
16
  const qwikPlugin: FastifyPluginAsync<FastifyQwikOptions> = async (
18
17
  fastify,
@@ -1,7 +1,7 @@
1
1
  import { nodeServerAdapter } from "@qwik.dev/router/adapters/node-server/vite";
2
2
  import { extendConfig } from "@qwik.dev/router/vite";
3
3
  import { builtinModules } from "module";
4
- import baseConfig from "../../vite.config.mts";
4
+ import baseConfig from "../../vite.config.ts";
5
5
  export default extendConfig(baseConfig, () => {
6
6
  return {
7
7
  ssr: {
@@ -12,7 +12,7 @@ export default extendConfig(baseConfig, () => {
12
12
  minify: false,
13
13
  ssr: true,
14
14
  rollupOptions: {
15
- input: ["./src/entry-firebase.tsx", "@qwik-router-config"],
15
+ input: ["./src/entry-firebase.tsx"],
16
16
  },
17
17
  outDir: "./functions/server",
18
18
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "Firebase",
3
3
  "scripts": {
4
- "build.server": "vite build -c adapters/firebase/vite.config.mts",
4
+ "build.server": "qwik check-client src dist && vite build -c adapters/firebase/vite.config.ts",
5
5
  "serve": "qwik build && firebase emulators:start",
6
6
  "deploy": "firebase deploy"
7
7
  },
@@ -20,5 +20,6 @@
20
20
  "- cd functions && pnpm i"
21
21
  ]
22
22
  }
23
- }
23
+ },
24
+ "type": "module"
24
25
  }
@@ -7,7 +7,6 @@
7
7
  * - https://qwik.dev/docs/deployments/firebase/
8
8
  *
9
9
  */
10
- import qwikRouterConfig from "@qwik-router-config";
11
10
  import {
12
11
  createQwikRouter,
13
12
  type PlatformFirebase,
@@ -15,7 +14,7 @@ import {
15
14
  import render from "./entry.ssr";
16
15
 
17
16
  declare global {
18
- interface QwikRouterPlatform extends PlatformFirebase {}
17
+ type QwikRouterPlatform = PlatformFirebase;
19
18
  }
20
19
 
21
- export default createQwikRouter({ render, qwikRouterConfig });
20
+ export default createQwikRouter({ render });
@@ -1,13 +1,13 @@
1
1
  import { netlifyEdgeAdapter } from "@qwik.dev/router/adapters/netlify-edge/vite";
2
2
  import { extendConfig } from "@qwik.dev/router/vite";
3
- import baseConfig from "../../vite.config.mts";
3
+ import baseConfig from "../../vite.config.ts";
4
4
 
5
5
  export default extendConfig(baseConfig, () => {
6
6
  return {
7
7
  build: {
8
8
  ssr: true,
9
9
  rollupOptions: {
10
- input: ["src/entry.netlify-edge.tsx", "@qwik-router-config"],
10
+ input: ["src/entry.netlify-edge.tsx"],
11
11
  },
12
12
  outDir: ".netlify/edge-functions/entry.netlify-edge",
13
13
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "Netlify Edge Functions",
3
3
  "scripts": {
4
- "build.server": "vite build -c adapters/netlify-edge/vite.config.mts",
4
+ "build.server": "qwik check-client src dist && vite build -c adapters/netlify-edge/vite.config.ts",
5
5
  "deploy": "netlify deploy --build"
6
6
  },
7
7
  "devDependencies": {
@@ -25,5 +25,6 @@
25
25
  "- pnpm run deploy: it will use the netlify CLI to deploy your site"
26
26
  ]
27
27
  }
28
- }
28
+ },
29
+ "type": "module"
29
30
  }
@@ -7,7 +7,6 @@
7
7
  * - https://qwik.dev/docs/deployments/netlify-edge/
8
8
  *
9
9
  */
10
- import qwikRouterConfig from "@qwik-router-config";
11
10
  import {
12
11
  createQwikRouter,
13
12
  type PlatformNetlify,
@@ -15,7 +14,7 @@ import {
15
14
  import render from "./entry.ssr";
16
15
 
17
16
  declare global {
18
- interface QwikRouterPlatform extends PlatformNetlify {}
17
+ type QwikRouterPlatform = PlatformNetlify;
19
18
  }
20
19
 
21
- export default createQwikRouter({ render, qwikRouterConfig });
20
+ export default createQwikRouter({ render });
@@ -1,13 +1,13 @@
1
1
  import { nodeServerAdapter } from "@qwik.dev/router/adapters/node-server/vite";
2
2
  import { extendConfig } from "@qwik.dev/router/vite";
3
- import baseConfig from "../../vite.config.mts";
3
+ import baseConfig from "../../vite.config.ts";
4
4
 
5
5
  export default extendConfig(baseConfig, () => {
6
6
  return {
7
7
  build: {
8
8
  ssr: true,
9
9
  rollupOptions: {
10
- input: ["src/entry.node-server.tsx", "@qwik-router-config"],
10
+ input: ["src/entry.node-server.tsx"],
11
11
  },
12
12
  },
13
13
  plugins: [nodeServerAdapter({ name: "node-server" })],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "Vanilla Node server",
3
3
  "scripts": {
4
- "build.server": "vite build -c adapters/node-server/vite.config.mts",
4
+ "build.server": "qwik check-client src dist && vite build -c adapters/node-server/vite.config.ts",
5
5
  "serve": "node server/entry.node-server"
6
6
  },
7
7
  "__qwik__": {
@@ -19,5 +19,6 @@
19
19
  "- pnpm run serve: runs the production server locally"
20
20
  ]
21
21
  }
22
- }
22
+ },
23
+ "type": "module"
23
24
  }
@@ -7,7 +7,6 @@
7
7
  * - https://qwik.dev/docs/deployments/node/
8
8
  *
9
9
  */
10
- import qwikRouterConfig from "@qwik-router-config";
11
10
  import { createQwikRouter } from "@qwik.dev/router/middleware/node";
12
11
  import { createServer } from "node:http";
13
12
  import render from "./entry.ssr";
@@ -18,7 +17,6 @@ const PORT = process.env.PORT ?? 3004;
18
17
  // Create the Qwik Router express middleware
19
18
  const { router, notFound, staticFile } = createQwikRouter({
20
19
  render,
21
- qwikRouterConfig,
22
20
  static: {
23
21
  cacheControl: "public, max-age=31536000, immutable",
24
22
  },
@@ -1,6 +1,6 @@
1
- import { staticAdapter } from "@qwik.dev/router/adapters/static/vite";
1
+ import { ssgAdapter } from "@qwik.dev/router/adapters/ssg/vite";
2
2
  import { extendConfig } from "@qwik.dev/router/vite";
3
- import baseConfig from "../../vite.config.mts";
3
+ import baseConfig from "../../vite.config.ts";
4
4
 
5
5
  export default extendConfig(baseConfig, () => {
6
6
  return {
@@ -11,7 +11,7 @@ export default extendConfig(baseConfig, () => {
11
11
  },
12
12
  },
13
13
  plugins: [
14
- staticAdapter({
14
+ ssgAdapter({
15
15
  origin: "https://yoursite.qwik.dev",
16
16
  }),
17
17
  ],
@@ -0,0 +1,20 @@
1
+ {
2
+ "description": "Static Site Generator",
3
+ "scripts": {
4
+ "build.server": "qwik check-client src dist && vite build -c adapters/ssg/vite.config.ts"
5
+ },
6
+ "__qwik__": {
7
+ "priority": 10,
8
+ "displayName": "Adapter: Static Site Generation (.html files)",
9
+ "docs": [
10
+ "https://qwik.dev/docs/guides/static-site-generation/"
11
+ ],
12
+ "nextSteps": {
13
+ "lines": [
14
+ "You have to change the 'origin' url under ssgAdapter",
15
+ "inside './adapters/ssg/vite.config.ts'"
16
+ ]
17
+ }
18
+ },
19
+ "type": "module"
20
+ }
@@ -4,12 +4,12 @@ This starter site is configured to deploy to [Vercel Edge Functions](https://ver
4
4
 
5
5
  ## Installation
6
6
 
7
- The adaptor will add a new `vite.config.mts` within the `adapters/` directory, and a new entry file will be created, such as:
7
+ The adaptor will add a new `vite.config.ts` within the `adapters/` directory, and a new entry file will be created, such as:
8
8
 
9
9
  ```
10
10
  └── adapters/
11
11
  └── vercel-edge/
12
- └── vite.config.mts
12
+ └── vite.config.ts
13
13
  └── src/
14
14
  └── entry.vercel-edge.tsx
15
15
  ```
@@ -1,13 +1,13 @@
1
1
  import { vercelEdgeAdapter } from "@qwik.dev/router/adapters/vercel-edge/vite";
2
2
  import { extendConfig } from "@qwik.dev/router/vite";
3
- import baseConfig from "../../vite.config.mts";
3
+ import baseConfig from "../../vite.config.ts";
4
4
 
5
5
  export default extendConfig(baseConfig, () => {
6
6
  return {
7
7
  build: {
8
8
  ssr: true,
9
9
  rollupOptions: {
10
- input: ["src/entry.vercel-edge.tsx", "@qwik-router-config"],
10
+ input: ["src/entry.vercel-edge.tsx"],
11
11
  },
12
12
  outDir: ".vercel/output/functions/_qwik-router.func",
13
13
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "Vercel Edge Functions",
3
3
  "scripts": {
4
- "build.server": "vite build -c adapters/vercel-edge/vite.config.mts",
4
+ "build.server": "qwik check-client src dist && vite build -c adapters/vercel-edge/vite.config.ts",
5
5
  "deploy": "vercel deploy"
6
6
  },
7
7
  "devDependencies": {
@@ -24,5 +24,6 @@
24
24
  "- pnpm run deploy: it will use the Vercel CLI to deploy your site"
25
25
  ]
26
26
  }
27
- }
27
+ },
28
+ "type": "module"
28
29
  }
@@ -7,7 +7,6 @@
7
7
  * - https://qwik.dev/docs/deployments/vercel-edge/
8
8
  *
9
9
  */
10
- import qwikRouterConfig from "@qwik-router-config";
11
10
  import {
12
11
  createQwikRouter,
13
12
  type PlatformVercel,
@@ -15,7 +14,7 @@ import {
15
14
  import render from "./entry.ssr";
16
15
 
17
16
  declare global {
18
- interface QwikRouterPlatform extends PlatformVercel {}
17
+ type QwikRouterPlatform = PlatformVercel;
19
18
  }
20
19
 
21
- export default createQwikRouter({ render, qwikRouterConfig });
20
+ export default createQwikRouter({ render });
@@ -10,7 +10,7 @@
10
10
  ]
11
11
  },
12
12
  {
13
- "source": "/(assets|build)/.*",
13
+ "source": "/(assets|build)/(.*)",
14
14
  "headers": [
15
15
  {
16
16
  "key": "Cache-Control",
@@ -17,6 +17,6 @@
17
17
  }
18
18
  },
19
19
  "devDependencies": {
20
- "@auth/qwik": "0.5.4"
20
+ "@auth/qwik": "0.8.0"
21
21
  }
22
22
  }
@@ -0,0 +1,37 @@
1
+ {
2
+ "description": "Add compiled-i18n to your Qwik app",
3
+ "__qwik__": {
4
+ "displayName": "Integration: compiled-i18n (compile time translations)",
5
+ "priority": -10,
6
+ "viteConfig": {
7
+ "imports": [
8
+ {
9
+ "namedImports": [
10
+ "i18nPlugin"
11
+ ],
12
+ "importPath": "compiled-i18n/vite"
13
+ }
14
+ ],
15
+ "vitePlugins": [
16
+ "i18nPlugin({ locales: ['en'] })"
17
+ ]
18
+ },
19
+ "docs": [
20
+ "https://qwik.dev/docs/integrations/i18n/#localize",
21
+ "https://github.com/wmertens/compiled-i18n/blob/main/Readme.md"
22
+ ],
23
+ "nextSteps": {
24
+ "title": "Next Steps",
25
+ "lines": [
26
+ " - Change the `locales` array in the vite config to add more languages",
27
+ " - Use the `src/components/locale-selector/locale-selector.tsx` component to switch languages",
28
+ "",
29
+ " Check out the compiled-i18n docs:",
30
+ " - https://github.com/wmertens/compiled-i18n/blob/main/Readme.md"
31
+ ]
32
+ }
33
+ },
34
+ "devDependencies": {
35
+ "compiled-i18n": "latest"
36
+ }
37
+ }
@@ -0,0 +1,30 @@
1
+ import { component$, getLocale } from "@builder.io/qwik";
2
+ import { _, locales } from "compiled-i18n";
3
+
4
+ export const LocaleSelector = component$(() => {
5
+ const currentLocale = getLocale();
6
+ return (
7
+ <>
8
+ {locales.map((locale) => {
9
+ const isCurrent = locale === currentLocale;
10
+ return (
11
+ // Note, you must use `<a>` and not `<Link>` so the page reloads
12
+ <a
13
+ key={locale}
14
+ // When using route-based locale selection, build the URL here
15
+ href={`?locale=${locale}`}
16
+ aria-disabled={isCurrent}
17
+ class={
18
+ "btn btn-ghost btn-sm" +
19
+ (isCurrent
20
+ ? " bg-neutralContent text-neutral pointer-events-none"
21
+ : " bg-base-100 text-base-content")
22
+ }
23
+ >
24
+ {locale}
25
+ </a>
26
+ );
27
+ })}
28
+ </>
29
+ );
30
+ });
@@ -0,0 +1,31 @@
1
+ /**
2
+ * WHAT IS THIS FILE?
3
+ *
4
+ * SSR renderer function, used by Qwik Router.
5
+ *
6
+ * Note that this is the only place the Qwik renderer is called.
7
+ * On the client, containers resume and do not call render.
8
+ */
9
+ import { createRenderer } from "@qwik.dev/router";
10
+ import { extractBase, setSsrLocaleGetter } from "compiled-i18n/qwik";
11
+ import Root from "./root";
12
+
13
+ setSsrLocaleGetter();
14
+
15
+ export default createRenderer((opts) => {
16
+ return {
17
+ jsx: <Root />,
18
+ options: {
19
+ ...opts,
20
+
21
+ // determine the base URL for the client code
22
+ base: extractBase,
23
+
24
+ // Use container attributes to set attributes on the html tag.
25
+ containerAttributes: {
26
+ lang: opts.serverData?.locale ?? "en-us",
27
+ ...opts.containerAttributes,
28
+ },
29
+ },
30
+ };
31
+ });
@@ -0,0 +1,28 @@
1
+ // ... other imports
2
+ import { guessLocale } from "compiled-i18n";
3
+ import type { RequestHandler } from "@builder.io/qwik-city";
4
+
5
+ /**
6
+ * Handle incoming requests to determine and set the appropriate locale.
7
+ * This function checks for a 'locale' query parameter, then a `locale` cookie,
8
+ * and finally falls back to the 'Accept-Language' header.
9
+ */
10
+ export const onRequest: RequestHandler = async ({
11
+ query,
12
+ cookie,
13
+ headers,
14
+ locale,
15
+ }) => {
16
+ // Allow overriding locale with query param `locale`
17
+ if (query.has("locale")) {
18
+ const newLocale = guessLocale(query.get("locale"));
19
+ cookie.delete("locale");
20
+ cookie.set("locale", newLocale, {});
21
+ locale(newLocale);
22
+ } else {
23
+ // Choose locale based on cookie or accept-language header
24
+ const maybeLocale =
25
+ cookie.get("locale")?.value || headers.get("accept-language");
26
+ locale(guessLocale(maybeLocale));
27
+ }
28
+ };
@@ -0,0 +1,23 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Qwik browser-only starter</title>
7
+
8
+ <script async type="module" src="@qwik.dev/core/qwikloader.js">
9
+ // ^ This is the QwikLoader, it's required for Qwik to work
10
+ </script>
11
+ </head>
12
+ <body>
13
+ <div id="root"></div>
14
+
15
+ <script type="module">
16
+ import { render, jsx } from "@qwik.dev/core";
17
+ import Root from "./src/root";
18
+
19
+ /** This renders your application */
20
+ render(document.querySelector("#root"), jsx(Root));
21
+ </script>
22
+ </body>
23
+ </html>
@@ -0,0 +1,29 @@
1
+ {
2
+ "description": "Use Qwik in browser-only mode",
3
+ "__qwik__": {
4
+ "displayName": "Integration: Qwik in browser-only mode",
5
+ "priority": -10,
6
+ "viteConfig": {},
7
+ "docs": [
8
+ "https://qwik.dev/docs/integrations/client-only/"
9
+ ],
10
+ "nextSteps": {
11
+ "title": "Next Steps",
12
+ "lines": [
13
+ " - run `pnpm dev` to start the development server",
14
+ " - run `pnpm preview` to view a production build",
15
+ " - run `pnpm build` to build the application"
16
+ ]
17
+ }
18
+ },
19
+ "dependencies": {
20
+ "@qwik.dev/core": "workspace:*"
21
+ },
22
+ "devDependencies": {
23
+ "vite": "7.3.1"
24
+ },
25
+ "scripts": {
26
+ "dev": "vite",
27
+ "build": "vite build"
28
+ }
29
+ }
@@ -0,0 +1,15 @@
1
+ import { component$ } from "@qwik.dev/core";
2
+
3
+ import "./global.css";
4
+
5
+ export default component$(() => {
6
+ /**
7
+ * The starting point of the application.
8
+ */
9
+
10
+ return (
11
+ <div>
12
+ <h1>Hello World</h1>
13
+ </div>
14
+ );
15
+ });
@@ -0,0 +1,13 @@
1
+ /**
2
+ * This is the base config for vite.
3
+ * When building, the adapter config is used which loads this file and extends it.
4
+ */
5
+ import { qwikVite } from "@qwik.dev/core/optimizer";
6
+ import { defineConfig, type UserConfig } from "vite";
7
+ import tsconfigPaths from "vite-tsconfig-paths";
8
+
9
+ export default defineConfig((): UserConfig => {
10
+ return {
11
+ plugins: [qwikVite({ csr: true }), tsconfigPaths({ root: "." })],
12
+ };
13
+ });
@@ -0,0 +1,5 @@
1
+ import { routeAction$ } from "@builder.io/qwik-city";
2
+
3
+ export const useExampleAction = routeAction$(() => {
4
+ return "This is example action data.";
5
+ });
@@ -1,18 +1,60 @@
1
+ import { $, component$ } from "@builder.io/qwik";
2
+ import { QwikCityMockProvider } from "@builder.io/qwik-city";
3
+
1
4
  import { ExampleTest } from "./example";
5
+ import { useExampleLoader } from "../../loaders/example.loader";
6
+ import { useExampleAction } from "../../actions/example.action";
7
+
8
+ const Template = component$((props: { flag: boolean }) => {
9
+ const loadersMock = [
10
+ {
11
+ loader: useExampleLoader,
12
+ data: "Loader Data",
13
+ },
14
+ ];
15
+
16
+ const actionStub = $(() => cy.stub().as("actionStub"))();
17
+ const actionsMock = [
18
+ {
19
+ action: useExampleAction,
20
+ handler: $(async () => {
21
+ await actionStub.then((_) => _());
22
+ return { status: 200, result: "Action Data" };
23
+ }),
24
+ },
25
+ ];
26
+
27
+ return (
28
+ <QwikCityMockProvider loaders={loadersMock} actions={actionsMock}>
29
+ <ExampleTest flag={props.flag} />
30
+ </QwikCityMockProvider>
31
+ );
32
+ });
2
33
 
3
34
  it("should render ⭐", () => {
4
- cy.mount(<ExampleTest flag={true} />);
5
- cy.get("div.icon").should("contain.text", "⭐");
35
+ cy.mount(<Template flag={true} />);
36
+ cy.get("#icon").should("contain.text", "⭐");
6
37
  });
7
38
 
8
39
  it("should render 💣", () => {
9
- cy.mount(<ExampleTest flag={false} />);
10
- cy.get("div.icon").should("contain.text", "💣");
40
+ cy.mount(<Template flag={false} />);
41
+ cy.get("#icon").should("contain.text", "💣");
11
42
  });
12
43
 
13
44
  it("should count clicks", () => {
14
- cy.mount(<ExampleTest flag={true} />);
15
- cy.get("span").should("contain.text", "Count:0");
16
- cy.get("button").click();
17
- cy.get("span").should("contain.text", "Count:1");
45
+ cy.mount(<Template flag={true} />);
46
+ cy.get("#count").should("contain.text", "Count:0");
47
+ cy.get("#btn-counter").click();
48
+ cy.get("#count").should("contain.text", "Count:1");
49
+ });
50
+
51
+ it("should render loader data", () => {
52
+ cy.mount(<Template flag={true} />);
53
+ cy.get("#loader-data").should("contain.text", "Loader Data");
54
+ });
55
+
56
+ it("should call action on button click", () => {
57
+ cy.mount(<Template flag={true} />);
58
+ cy.get("#btn-action").click();
59
+ cy.get("@actionStub").should("have.been.called");
18
60
  });
@@ -1,17 +1,27 @@
1
1
  import { component$, useStore } from "@qwik.dev/core";
2
2
 
3
+ import { useExampleLoader } from "../../loaders/example.loader";
4
+ import { useExampleAction } from "../../actions/example.action";
5
+
3
6
  export const ExampleTest = component$((props: { flag: boolean }) => {
4
7
  const state = useStore({
5
8
  counter: 0,
6
9
  });
7
10
 
11
+ const loaderState = useExampleLoader();
12
+ const action = useExampleAction();
13
+
8
14
  return (
9
15
  <>
10
- <span>Count:{state.counter}</span>
11
- <div class="icon">Flag: {props.flag ? "⭐" : "💣"}</div>
12
- <button class="btn-counter" onClick$={() => state.counter++}>
16
+ <span id="count">Count:{state.counter}</span>
17
+ <div id="icon">Flag: {props.flag ? "⭐" : "💣"}</div>
18
+ <button id="btn-counter" onClick$={() => state.counter++}>
13
19
  Increment counter
14
20
  </button>
21
+ <span id="loader-data">{loaderState.value}</span>
22
+ <button id="btn-action" onClick$={() => action.submit()}>
23
+ Call action
24
+ </button>
15
25
  </>
16
26
  );
17
27
  });
@@ -0,0 +1,5 @@
1
+ import { routeLoader$ } from "@builder.io/qwik-city";
2
+
3
+ export const useExampleLoader = routeLoader$(() => {
4
+ return "This is example loader data.";
5
+ });
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "devDependencies": {
25
25
  "@builder.io/vite-plugin-macro": "~0.0.7",
26
- "@pandacss/dev": "^0.51.1"
26
+ "@pandacss/dev": "^0.54.0"
27
27
  },
28
28
  "scripts": {
29
29
  "prebuild.pandacss": "panda codegen --silent"