diff --git a/.changeset/green-jobs-jog.md b/.changeset/green-jobs-jog.md new file mode 100644 index 00000000..316147e4 --- /dev/null +++ b/.changeset/green-jobs-jog.md @@ -0,0 +1,18 @@ +--- +"@qwikdev/astro": patch +--- + +feat: support global config for renderOpts + +You can now pass the `renderOpts` option to the `qwik` integration to set global render options for all Qwik components. + +For example, let's say we wanted to change the base URL for all Qwik build assets on every component used in an Astro file. + +```ts +import { defineConfig } from "astro/config"; +import qwik from "@qwikdev/astro"; + +export default defineConfig({ + integrations: [qwik({ include: "**/qwik/*", renderOpts: { base: "my-cdn-url/build" } })] +}); +``` \ No newline at end of file diff --git a/apps/demo/src/pages/index.astro b/apps/demo/src/pages/index.astro index bb96d07a..6ff567a9 100644 --- a/apps/demo/src/pages/index.astro +++ b/apps/demo/src/pages/index.astro @@ -12,7 +12,7 @@ import { Counter as NativeCounter } from "@components/qwik/counter";
- +
diff --git a/libs/qwikdev-astro/package.json b/libs/qwikdev-astro/package.json index dc2497dc..658e8635 100644 --- a/libs/qwikdev-astro/package.json +++ b/libs/qwikdev-astro/package.json @@ -61,6 +61,7 @@ }, "bugs": "https://github.com/thejackshelton/@qwikdev/astro/issues", "dependencies": { + "@inox-tools/aik-mod": "^0.11.0", "astro-integration-kit": "^0.18.0" }, "devDependencies": { diff --git a/libs/qwikdev-astro/server.ts b/libs/qwikdev-astro/server.ts index d4121af6..6fed783e 100644 --- a/libs/qwikdev-astro/server.ts +++ b/libs/qwikdev-astro/server.ts @@ -3,6 +3,7 @@ import { isDev } from "@builder.io/qwik/build"; import type { QwikManifest } from "@builder.io/qwik/optimizer"; import { type RenderToStreamOptions, renderToStream } from "@builder.io/qwik/server"; import type { SSRResult } from "astro"; +import { renderOpts as globalRenderOpts } from "virtual:qwikdev-astro"; const containerMap = new WeakMap(); @@ -73,7 +74,7 @@ export async function renderToStaticMarkup( const isInitialContainer = !containerMap.has(this.result); const renderToStreamOpts: RenderToStreamOptions = { - ...(props.renderOpts ?? {}), + ...(props.renderOpts ?? globalRenderOpts ?? {}), containerAttributes: { style: "display: contents", ...(isDev && { "q-astro-marker": "" }) diff --git a/libs/qwikdev-astro/src/index.ts b/libs/qwikdev-astro/src/index.ts index 8f41001e..588554a5 100644 --- a/libs/qwikdev-astro/src/index.ts +++ b/libs/qwikdev-astro/src/index.ts @@ -6,11 +6,29 @@ import type { QwikVitePluginOptions, SymbolMapperFn } from "@builder.io/qwik/optimizer"; +import type { RenderOptions } from "@builder.io/qwik/server"; import type { AstroConfig, AstroIntegration } from "astro"; -import { createResolver, defineIntegration, watchDirectory } from "astro-integration-kit"; +import { createResolver, defineIntegration, watchDirectory, withPlugins } from "astro-integration-kit"; import { z } from "astro/zod"; import { type PluginOption, build, createFilter } from "vite"; import type { InlineConfig } from "vite"; +import aikMod from '@inox-tools/aik-mod'; + +// TODO: contributing this back to aik-mod where we export the type +type DefineModuleOptions = { + constExports?: Record; + defaultExport?: unknown; +}; + +type SetupPropsWithAikMod = + Parameters< + NonNullable + >[0] & { + defineModule: ( + name: string, + options: DefineModuleOptions + ) => string; + }; declare global { var symbolMapperFn: SymbolMapperFn; @@ -26,12 +44,14 @@ const FilterPatternSchema = z.union([ z.null() ]); +const name = "@qwikdev/astro"; + /** * This project uses Astro Integration Kit. * @see https://astro-integration-kit.netlify.app/ */ export default defineIntegration({ - name: "@qwikdev/astro", + name, optionsSchema: z .object({ /** @@ -48,11 +68,12 @@ export default defineIntegration({ * Enable debug mode with the qwikVite plugin. */ debug: z.boolean().optional(), - /** - * Use node's readFileSync to read the manifest. Common for deployment providers that don't support dynamic json imports. When false, please ensure your deployment provider supports dynamic json imports, through environment variables or other means. + * Options passed into each Qwik component's `renderToStream` call. */ - isNode: z.boolean().optional().default(true) + renderOpts: z.custom((data) => { + return typeof data === "object" && data !== null; + }).optional() }) .optional(), @@ -77,7 +98,7 @@ export default defineIntegration({ const lifecycleHooks: AstroIntegration["hooks"] = { "astro:config:setup": async (setupProps) => { - const { addRenderer, updateConfig, config } = setupProps; + const { addRenderer, updateConfig, config, defineModule } = setupProps as SetupPropsWithAikMod; astroConfig = config; // integration HMR support watchDirectory(setupProps, resolver()); @@ -86,6 +107,12 @@ export default defineIntegration({ serverEntrypoint: resolver("../server.ts") }); + defineModule('virtual:qwikdev-astro', { + constExports: { + renderOpts: options?.renderOpts ?? {} + } + }); + /** Relative paths, as the Qwik optimizer handles normalization */ srcDir = getRelativePath(astroConfig.root.pathname, astroConfig.srcDir.pathname); @@ -319,12 +346,14 @@ export default defineIntegration({ } }; - return { - hooks: lifecycleHooks - }; + return withPlugins({ + name, + hooks: lifecycleHooks, + plugins: [aikMod] + }); } }); function getRelativePath(from: string, to: string) { return to.replace(from, "") || "."; -} +} \ No newline at end of file diff --git a/libs/qwikdev-astro/src/virtual.d.ts b/libs/qwikdev-astro/src/virtual.d.ts index 8d74bd10..cfc1c03f 100644 --- a/libs/qwikdev-astro/src/virtual.d.ts +++ b/libs/qwikdev-astro/src/virtual.d.ts @@ -1,4 +1,6 @@ -declare module "inox:inline-mod:mod_0" { - export const isNode: boolean; - export const qAstroManifestPath: string; +declare module "virtual:qwikdev-astro" { + import type { RenderOptions } from "@builder.io/qwik/server"; + + const renderOpts: RenderOptions; + export { renderOpts }; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 714d12b7..d88f4097 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -217,6 +217,9 @@ importers: libs/qwikdev-astro: dependencies: + '@inox-tools/aik-mod': + specifier: ^0.11.0 + version: 0.11.0(astro-integration-kit@0.18.0(astro@5.9.2(@types/node@24.0.0)(jiti@2.4.2)(rollup@4.43.0)(tsx@4.20.1)(typescript@5.8.3)(yaml@2.8.0)))(astro@5.9.2(@types/node@24.0.0)(jiti@2.4.2)(rollup@4.43.0)(tsx@4.20.1)(typescript@5.8.3)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.20.1)(yaml@2.8.0)) astro-integration-kit: specifier: ^0.18.0 version: 0.18.0(astro@5.9.2(@types/node@24.0.0)(jiti@2.4.2)(rollup@4.43.0)(tsx@4.20.1)(typescript@5.8.3)(yaml@2.8.0)) @@ -824,14 +827,31 @@ packages: cpu: [x64] os: [win32] + '@inox-tools/aik-mod@0.11.0': + resolution: {integrity: sha512-0mFOrKPa2jz23g4caa7+MsxitiKMgyzn/4e+mLdpEzlWnB0HZP50AeL2rX6CioKw+Pi2zgo96mYDc1skh0/Otg==} + peerDependencies: + astro: ^5 + astro-integration-kit: ~0.17 || ~0.18 + '@inox-tools/astro-tests@0.6.1': resolution: {integrity: sha512-j0yq/9AWawSoKSpon5xsGGRrEu0NoEE+6lubbJbP7cjCISVGBIp82aCmGBt+SxoM1A38+QfC/TcLpArKohdLNw==} peerDependencies: astro: ^5.7.12 + '@inox-tools/inline-mod@2.2.0': + resolution: {integrity: sha512-d2hA6Ggy1fjVZEgO/an6DtYB9mkF9aWApJoeGBaARrjouJ6Tkle3F1+ULc1pq+94xc3gXav7Wa8zu5FJXSLPMA==} + peerDependencies: + vite: ^4 || ^5 || ^6 + peerDependenciesMeta: + vite: + optional: true + '@inox-tools/utils@0.4.0': resolution: {integrity: sha512-9F46GQ3UUNHyb/Qjkra/7sMjNybf+6BanYIE1sBYOwEB+yDqjZKsv0VbZhvoA1QpANzUGEBlbhjD6N/PATBdsQ==} + '@inox-tools/utils@0.6.0': + resolution: {integrity: sha512-R8sYd4G+SA7Jy1YLmIZkKnE9UKx+0lzmn3uEfOXvzNWXjJAKTad1/9G1p19KY/AhkwfcATupyiKayueH6mlnfA==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -3122,6 +3142,7 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -4471,6 +4492,16 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@inox-tools/aik-mod@0.11.0(astro-integration-kit@0.18.0(astro@5.9.2(@types/node@24.0.0)(jiti@2.4.2)(rollup@4.43.0)(tsx@4.20.1)(typescript@5.8.3)(yaml@2.8.0)))(astro@5.9.2(@types/node@24.0.0)(jiti@2.4.2)(rollup@4.43.0)(tsx@4.20.1)(typescript@5.8.3)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.20.1)(yaml@2.8.0))': + dependencies: + '@inox-tools/inline-mod': 2.2.0(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.20.1)(yaml@2.8.0)) + astro: 5.9.2(@types/node@24.0.0)(jiti@2.4.2)(rollup@4.43.0)(tsx@4.20.1)(typescript@5.8.3)(yaml@2.8.0) + astro-integration-kit: 0.18.0(astro@5.9.2(@types/node@24.0.0)(jiti@2.4.2)(rollup@4.43.0)(tsx@4.20.1)(typescript@5.8.3)(yaml@2.8.0)) + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + - vite + '@inox-tools/astro-tests@0.6.1(astro@5.9.2(@types/node@22.15.31)(jiti@2.4.2)(rollup@4.43.0)(tsx@4.20.1)(typescript@5.8.3)(yaml@2.8.0))': dependencies: '@astrojs/internal-helpers': 0.6.1 @@ -4486,8 +4517,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@inox-tools/inline-mod@2.2.0(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.20.1)(yaml@2.8.0))': + dependencies: + '@inox-tools/utils': 0.6.0 + debug: 4.4.1 + typescript: 5.8.3 + optionalDependencies: + vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.20.1)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color + '@inox-tools/utils@0.4.0': {} + '@inox-tools/utils@0.6.0': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2