@wix/astro 0.1.1

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.
package/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # Wix Astro Integration
2
+
3
+ ## Features
4
+
5
+ ### Session Management
6
+
7
+ The Wix Astro integration provides session management for your Astro project.
8
+
9
+ ### Integrating into an exinsting Astro project
10
+
11
+ If you already have an Astro project and you want to add the Wix Astro integration to it, follow these steps:
12
+
13
+ 1. Install the Wix Astro integration package and the Wix CLI packages:
14
+
15
+ ```bash
16
+ npm install @wix/astro @wix/cli @wix/cli-astro
17
+ ```
18
+
19
+ 2. Add the Wix integration to your Astro project's `astro.config.mjs` file:
20
+
21
+ ```js
22
+ import wix from "@wix/astro-internal";
23
+
24
+ export default {
25
+ // ...
26
+ output: "server",
27
+ integrations: [wix()],
28
+ // ...
29
+ };
30
+ ```
31
+
32
+ 3. Build your Astro project:
33
+
34
+ ```bash
35
+ npm run build
36
+ ```
37
+
38
+ 4. Create a `wix.config.json` at the root of your project:
39
+
40
+ ```json
41
+ {
42
+ "siteId": "<your site id>",
43
+ "projectId": "<your project id>"
44
+ }
45
+ ```
46
+
47
+ 4. Deploy your Astro project to Wix:
48
+
49
+ ```bash
50
+ npx wix astro deploy
51
+ ```
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ export {};
2
+ // NOTE: this file is empty on purpose
3
+ // it allows use to offer `imageService: 'compile'`
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZW5kcG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW50cnlwb2ludHMvaW1hZ2UtZW5kcG9pbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHNDQUFzQztBQUN0QyxtREFBbUQifQ==
@@ -0,0 +1,3 @@
1
+ import type { ExternalImageService } from "astro";
2
+ declare const service: ExternalImageService;
3
+ export default service;
@@ -0,0 +1,35 @@
1
+ /// <reference types="astro/client" />
2
+ import { joinPaths } from "@astrojs/internal-helpers/path";
3
+ import { baseService } from "astro/assets";
4
+ import { isESMImportedImage, isRemoteAllowed } from "../utils/assets.js";
5
+ const service = {
6
+ ...baseService,
7
+ getURL: (options, imageConfig) => {
8
+ const resizingParams = [];
9
+ if (options.width)
10
+ resizingParams.push(`width=${options.width}`);
11
+ if (options.height)
12
+ resizingParams.push(`height=${options.height}`);
13
+ if (options.quality)
14
+ resizingParams.push(`quality=${options.quality}`);
15
+ if (options["fit"])
16
+ resizingParams.push(`fit=${options["fit"]}`);
17
+ if (options.format)
18
+ resizingParams.push(`format=${options.format}`);
19
+ let imageSource = "";
20
+ if (isESMImportedImage(options.src)) {
21
+ imageSource = options.src.src;
22
+ }
23
+ else if (isRemoteAllowed(options.src, imageConfig)) {
24
+ imageSource = options.src;
25
+ }
26
+ else {
27
+ // If it's not an imported image, nor is it allowed using the current domains or remote patterns, we'll just return the original URL
28
+ return options.src;
29
+ }
30
+ const imageEndpoint = joinPaths(import.meta.env.BASE_URL, "/cdn-cgi/image", resizingParams.join(","), imageSource);
31
+ return imageEndpoint;
32
+ },
33
+ };
34
+ export default service;
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Utc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRyeXBvaW50cy9pbWFnZS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNDQUFzQztBQUl0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFekUsTUFBTSxPQUFPLEdBQXlCO0lBQ3BDLEdBQUcsV0FBVztJQUNkLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRTtRQUMvQixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxPQUFPLENBQUMsS0FBSztZQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNqRSxJQUFJLE9BQU8sQ0FBQyxNQUFNO1lBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksT0FBTyxDQUFDLE9BQU87WUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdkUsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakUsSUFBSSxPQUFPLENBQUMsTUFBTTtZQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUVwRSxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDaEMsQ0FBQzthQUFNLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUM1QixDQUFDO2FBQU0sQ0FBQztZQUNOLG9JQUFvSTtZQUNwSSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDckIsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUN4QixnQkFBZ0IsRUFDaEIsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFDeEIsV0FBVyxDQUNaLENBQUM7UUFFRixPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0NBQ0YsQ0FBQztBQUVGLGVBQWUsT0FBTyxDQUFDIn0=
@@ -0,0 +1,2 @@
1
+ import { APIRoute } from "astro";
2
+ export declare const GET: APIRoute;
@@ -0,0 +1,6 @@
1
+ // @ts-expect-error
2
+ import wixManifest from "/src/wix/index";
3
+ export const GET = async ({}) => {
4
+ return Response.json(wixManifest);
5
+ };
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW50cnlwb2ludHMvbWFuaWZlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsbUJBQW1CO0FBQ25CLE9BQU8sV0FBVyxNQUFNLGdCQUFnQixDQUFDO0FBRXpDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBYSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDeEMsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3BDLENBQUMsQ0FBQyJ9
@@ -0,0 +1,20 @@
1
+ import type { CacheStorage as CLOUDFLARE_CACHESTORAGE, Request as CLOUDFLARE_REQUEST, ExecutionContext } from "@cloudflare/workers-types";
2
+ import type { SSRManifest } from "astro";
3
+ type Env = {
4
+ __STATIC_CONTENT: KVNamespace;
5
+ ASTRO_STUDIO_APP_TOKEN?: string;
6
+ };
7
+ export interface Runtime<T extends object = object> {
8
+ runtime: {
9
+ env: Env & T;
10
+ cf: CLOUDFLARE_REQUEST["cf"];
11
+ caches: CLOUDFLARE_CACHESTORAGE;
12
+ ctx: ExecutionContext;
13
+ };
14
+ }
15
+ export declare function createExports(manifest: SSRManifest): {
16
+ default: {
17
+ fetch: (request: Request & CLOUDFLARE_REQUEST, env: Env, context: ExecutionContext) => Promise<Response>;
18
+ };
19
+ };
20
+ export {};
@@ -0,0 +1,67 @@
1
+ import { App } from "astro/app";
2
+ import { getAssetFromKV } from "@cloudflare/kv-asset-handler";
3
+ // @ts-expect-error
4
+ import staticContentManifest from "__STATIC_CONTENT_MANIFEST";
5
+ import { createClient } from "@wix/sdk";
6
+ // @ts-expect-error
7
+ import wixManifest from "/src/wix/index";
8
+ export function createExports(manifest) {
9
+ const app = new App(manifest);
10
+ const runtimeManifest = wixManifest;
11
+ const client = createClient({});
12
+ for (const extension of runtimeManifest.extensions) {
13
+ if ("register" in extension) {
14
+ extension.register(client);
15
+ }
16
+ }
17
+ const fetch = async (request, env, context) => {
18
+ const { pathname } = new URL(request.url);
19
+ if (request.method === "POST" && pathname.startsWith("/_wix/events")) {
20
+ await client.webhooks.processRequest(request);
21
+ return new Response(null, { status: 200 });
22
+ }
23
+ if (request.method === "POST" &&
24
+ pathname.startsWith("/_wix/service-plugins")) {
25
+ return client.servicePlugins.processRequest(request);
26
+ }
27
+ const routeData = app.match(request);
28
+ if (!routeData) {
29
+ return await getAssetFromKV({
30
+ request,
31
+ waitUntil: context.waitUntil.bind(context),
32
+ }, {
33
+ ASSET_NAMESPACE: env.__STATIC_CONTENT,
34
+ ASSET_MANIFEST: JSON.parse(staticContentManifest),
35
+ cacheControl: {
36
+ bypassCache: true,
37
+ },
38
+ });
39
+ }
40
+ Reflect.set(request, Symbol.for("astro.clientAddress"), request.headers.get("cf-connecting-ip"));
41
+ process.env["ASTRO_STUDIO_APP_TOKEN"] ??= (() => {
42
+ if (typeof env.ASTRO_STUDIO_APP_TOKEN === "string") {
43
+ return env.ASTRO_STUDIO_APP_TOKEN;
44
+ }
45
+ })();
46
+ const locals = {
47
+ runtime: {
48
+ env: env,
49
+ cf: request.cf,
50
+ caches: caches,
51
+ ctx: {
52
+ waitUntil: (promise) => context.waitUntil(promise),
53
+ passThroughOnException: () => context.passThroughOnException(),
54
+ },
55
+ },
56
+ };
57
+ const response = await app.render(request, { routeData, locals });
58
+ if (app.setCookieHeaders) {
59
+ for (const setCookieHeader of app.setCookieHeaders(response)) {
60
+ response.headers.append("Set-Cookie", setCookieHeader);
61
+ }
62
+ }
63
+ return response;
64
+ };
65
+ return { default: { fetch } };
66
+ }
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VudHJ5cG9pbnRzL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxtQkFBbUI7QUFDbkIsT0FBTyxxQkFBcUIsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXhDLG1CQUFtQjtBQUNuQixPQUFPLFdBQVcsTUFBTSxnQkFBZ0IsQ0FBQztBQWdCekMsTUFBTSxVQUFVLGFBQWEsQ0FBQyxRQUFxQjtJQUNqRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixNQUFNLGVBQWUsR0FBYSxXQUFXLENBQUM7SUFDOUMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLEtBQUssTUFBTSxTQUFTLElBQUksZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ25ELElBQUksVUFBVSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzVCLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxLQUFLLEVBQ2pCLE9BQXFDLEVBQ3JDLEdBQVEsRUFDUixPQUF5QixFQUN6QixFQUFFO1FBQ0YsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUxQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssTUFBTSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUNyRSxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FB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
@@ -0,0 +1,25 @@
1
+ import { BuildEventDefinition, BuildServicePluginDefinition, EventDefinition, ServicePluginDefinition, WixClient } from "@wix/sdk";
2
+ export type WixExtensionsRegistrar = {
3
+ on<T extends EventDefinition>(event: T, ...args: Parameters<BuildEventDefinition<T>>): Manifest & WixExtensionsRegistrar;
4
+ provide<T extends ServicePluginDefinition<any>>(servicePlugin: {
5
+ provideHandlers: T;
6
+ }, config: unknown, ...impl: Parameters<BuildServicePluginDefinition<T>>): Manifest & WixExtensionsRegistrar;
7
+ plugin(manifest: Manifest): Manifest & WixExtensionsRegistrar;
8
+ permissions(permissions: string[]): Manifest & WixExtensionsRegistrar;
9
+ };
10
+ export type Manifest = {
11
+ extensions: Array<{
12
+ type: "ServicePlugin";
13
+ componentType: string;
14
+ config: unknown;
15
+ register(client: WixClient): void;
16
+ } | {
17
+ type: "EventHandler";
18
+ webhookSlug: string;
19
+ register(client: WixClient): void;
20
+ } | {
21
+ type: "Permission";
22
+ permission: string;
23
+ }>;
24
+ };
25
+ export declare const manifest: Manifest & WixExtensionsRegistrar;
@@ -0,0 +1,54 @@
1
+ function wixManifestRegistrar(manifest = { extensions: [] }) {
2
+ return {
3
+ ...manifest,
4
+ plugin(manifest) {
5
+ return wixManifestRegistrar({
6
+ extensions: [...this.extensions, ...manifest.extensions],
7
+ });
8
+ },
9
+ on(event, ...args) {
10
+ const newManifest = {
11
+ ...manifest,
12
+ extensions: [
13
+ ...manifest.extensions,
14
+ {
15
+ type: "EventHandler",
16
+ webhookSlug: event.type,
17
+ register: (client) => client.use(event)(...args),
18
+ },
19
+ ],
20
+ };
21
+ return wixManifestRegistrar(newManifest);
22
+ },
23
+ provide(servicePlugin, config, ...impl) {
24
+ const newManifest = {
25
+ ...manifest,
26
+ extensions: [
27
+ ...manifest.extensions,
28
+ {
29
+ type: "ServicePlugin",
30
+ componentType: servicePlugin.provideHandlers.componentType,
31
+ config,
32
+ register: (client) => client.use(servicePlugin.provideHandlers)(...impl),
33
+ },
34
+ ],
35
+ };
36
+ return wixManifestRegistrar(newManifest);
37
+ },
38
+ permissions(permissions) {
39
+ const newManifest = {
40
+ ...manifest,
41
+ extensions: [
42
+ ...manifest.extensions,
43
+ ...permissions.map((permission) => ({
44
+ type: "Permission",
45
+ permission,
46
+ })),
47
+ ],
48
+ };
49
+ return wixManifestRegistrar(newManifest);
50
+ },
51
+ };
52
+ }
53
+ export const manifest = wixManifestRegistrar();
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9leHRlbnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVDQSxTQUFTLG9CQUFvQixDQUMzQixXQUFxQixFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUU7SUFFdkMsT0FBTztRQUNMLEdBQUcsUUFBUTtRQUNYLE1BQU0sQ0FBQyxRQUFRO1lBQ2IsT0FBTyxvQkFBb0IsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQzthQUN6RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsRUFBRSxDQUNBLEtBQVEsRUFDUixHQUFHLElBQXlDO1lBRTVDLE1BQU0sV0FBVyxHQUFhO2dCQUM1QixHQUFHLFFBQVE7Z0JBQ1gsVUFBVSxFQUFFO29CQUNWLEdBQUcsUUFBUSxDQUFDLFVBQVU7b0JBQ3RCO3dCQUNFLElBQUksRUFBRSxjQUFjO3dCQUNwQixXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUk7d0JBQ3ZCLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ2xCLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUE2QixDQUFDLEdBQUcsSUFBSSxDQUFDO3FCQUMxRDtpQkFDRjthQUNGLENBQUM7WUFFRixPQUFPLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxPQUFPLENBQ0wsYUFBcUMsRUFDckMsTUFBZSxFQUNmLEdBQUcsSUFBaUQ7WUFFcEQsTUFBTSxXQUFXLEdBQWE7Z0JBQzVCLEdBQUcsUUFBUTtnQkFDWCxVQUFVLEVBQUU7b0JBQ1YsR0FBRyxRQUFRLENBQUMsVUFBVTtvQkFDdEI7d0JBQ0UsSUFBSSxFQUFFLGVBQWU7d0JBQ3JCLGFBQWEsRUFBRSxhQUFhLENBQUMsZUFBZSxDQUFDLGFBQWE7d0JBQzFELE1BQU07d0JBQ04sUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FFakIsTUFBTSxDQUFDLEdBQUcsQ0FDUixhQUFhLENBQUMsZUFBZSxDQUVoQyxDQUFDLEdBQUcsSUFBSSxDQUFDO3FCQUNiO2lCQUNGO2FBQ0YsQ0FBQztZQUVGLE9BQU8sb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELFdBQVcsQ0FBQyxXQUFxQjtZQUMvQixNQUFNLFdBQVcsR0FBYTtnQkFDNUIsR0FBRyxRQUFRO2dCQUNYLFVBQVUsRUFBRTtvQkFDVixHQUFHLFFBQVEsQ0FBQyxVQUFVO29CQUN0QixHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ2xDLElBQUksRUFBRSxZQUFxQjt3QkFDM0IsVUFBVTtxQkFDWCxDQUFDLENBQUM7aUJBQ0o7YUFDRixDQUFDO1lBRUYsT0FBTyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQyxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQyJ9
@@ -0,0 +1,33 @@
1
+ import type { AstroIntegration } from "astro";
2
+ export type { Runtime } from "./entrypoints/server.js";
3
+ export type Options = {
4
+ /** Options for handling images. */
5
+ imageService?: "passthrough" | "cloudflare" | "compile" | "custom";
6
+ /** Configuration for `_routes.json` generation. A _routes.json file controls when your Function is invoked. This file will include three different properties:
7
+ *
8
+ * - version: Defines the version of the schema. Currently there is only one version of the schema (version 1), however, we may add more in the future and aim to be backwards compatible.
9
+ * - include: Defines routes that will be invoked by Functions. Accepts wildcard behavior.
10
+ * - exclude: Defines routes that will not be invoked by Functions. Accepts wildcard behavior. `exclude` always take priority over `include`.
11
+ *
12
+ * Wildcards match any number of path segments (slashes). For example, `/users/*` will match everything after the `/users/` path.
13
+ *
14
+ */
15
+ routes?: {
16
+ /** Extend `_routes.json` */
17
+ extend: {
18
+ /** Paths which should be routed to the SSR function */
19
+ include?: {
20
+ /** Generally this is in pathname format, but does support wildcards, e.g. `/users`, `/products/*` */
21
+ pattern: string;
22
+ }[];
23
+ /** Paths which should be routed as static assets */
24
+ exclude?: {
25
+ /** Generally this is in pathname format, but does support wildcards, e.g. `/static`, `/assets/*`, `/images/avatar.jpg` */
26
+ pattern: string;
27
+ }[];
28
+ };
29
+ };
30
+ /** Enable WebAssembly support */
31
+ wasmModuleImports?: boolean;
32
+ };
33
+ export default function createIntegration(args?: Options): AstroIntegration;
package/dist/index.js ADDED
@@ -0,0 +1,290 @@
1
+ import { appendForwardSlash, prependForwardSlash, removeLeadingForwardSlash, } from "@astrojs/internal-helpers/path";
2
+ import { createRedirectsFromAstroRoutes } from "@astrojs/underscore-redirects";
3
+ import { AstroError } from "astro/errors";
4
+ import { walk } from "estree-walker";
5
+ import MagicString from "magic-string";
6
+ import { createReadStream } from "node:fs";
7
+ import { appendFile, rename, stat, unlink } from "node:fs/promises";
8
+ import { createRequire } from "node:module";
9
+ import { createInterface } from "node:readline/promises";
10
+ import { createRoutesFile, getParts } from "./utils/generate-routes-json.js";
11
+ import { setImageConfig } from "./utils/image-config.js";
12
+ import { mutateDynamicPageImportsInPlace, mutatePageMapInPlace, } from "./utils/index.js";
13
+ import { NonServerChunkDetector } from "./utils/non-server-chunk-detector.js";
14
+ import { wasmModuleLoader } from "./utils/wasm-module-loader.js";
15
+ import { buildResolver } from "esm-resolve";
16
+ import { fileURLToPath } from "node:url";
17
+ export default function createIntegration(args) {
18
+ let _config;
19
+ // Initialize the unused chunk analyzer as a shared state between hooks.
20
+ // The analyzer is used on earlier hooks to collect information about used hooks on a Vite plugin
21
+ // and then later after the full build to clean up unused chunks, so it has to be shared between them.
22
+ const chunkAnalyzer = new NonServerChunkDetector();
23
+ return {
24
+ name: "@astrojs/cloudflare",
25
+ hooks: {
26
+ "astro:config:setup": async ({ command, config, updateConfig, logger, addMiddleware, injectRoute, }) => {
27
+ const aRequire = buildResolver(fileURLToPath(import.meta.url), {
28
+ resolveToAbsolute: true,
29
+ });
30
+ addMiddleware({
31
+ entrypoint: aRequire("./middleware"),
32
+ order: "pre",
33
+ });
34
+ injectRoute({
35
+ entrypoint: aRequire("./entrypoints/manifest"),
36
+ pattern: "/_wix/manifest.json",
37
+ prerender: true,
38
+ });
39
+ updateConfig({
40
+ build: {
41
+ client: new URL(`.${prependForwardSlash(appendForwardSlash(config.base))}`, config.outDir),
42
+ server: new URL("./_worker.js/", config.outDir),
43
+ serverEntry: "index.js",
44
+ redirects: false,
45
+ },
46
+ vite: {
47
+ // load .wasm files as WebAssembly modules
48
+ plugins: [
49
+ wasmModuleLoader({
50
+ disabled: !args?.wasmModuleImports,
51
+ }),
52
+ chunkAnalyzer.getPlugin(),
53
+ {
54
+ name: "dynamic-imports-analyzer",
55
+ enforce: "post",
56
+ generateBundle(_, bundle) {
57
+ let astrojsSSRVirtualEntryAST;
58
+ const prerenderImports = [];
59
+ let entryChunk;
60
+ // Find all pages (ignore the ssr entrypoint) which are prerendered based on the dynamic imports of the prerender chunk
61
+ for (const chunk of Object.values(bundle)) {
62
+ if (chunk.type !== "chunk")
63
+ continue;
64
+ if (chunk.name === "_@astrojs-ssr-virtual-entry") {
65
+ astrojsSSRVirtualEntryAST = this.parse(chunk.code);
66
+ entryChunk = chunk;
67
+ continue;
68
+ }
69
+ const isPrerendered = chunk.dynamicImports.some((entry) => entry.includes("prerender"));
70
+ if (isPrerendered) {
71
+ prerenderImports.push(chunk.fileName);
72
+ }
73
+ }
74
+ if (!astrojsSSRVirtualEntryAST)
75
+ return;
76
+ if (!entryChunk)
77
+ return;
78
+ const s = new MagicString(entryChunk.code);
79
+ const constsToRemove = [];
80
+ walk(astrojsSSRVirtualEntryAST, {
81
+ leave(node) {
82
+ // We are only looking for VariableDeclarations, since both (dynamic imports and pageMap) are declared as constants in the code
83
+ if (node.type !== "VariableDeclaration")
84
+ return;
85
+ if (!node.declarations[0] ||
86
+ node.declarations[0].type !== "VariableDeclarator")
87
+ return;
88
+ // This function will remove the dynamic imports from the entrypoint
89
+ mutateDynamicPageImportsInPlace(node, prerenderImports, constsToRemove, s);
90
+ // This function will remove the pageMap entries which are invalid now
91
+ mutatePageMapInPlace(node, constsToRemove, s);
92
+ },
93
+ });
94
+ entryChunk.code = s.toString();
95
+ },
96
+ },
97
+ // The plugin is used to inject the Wix SDK context into the client bundle
98
+ // It's currently commented out because there are some issues with the current implementation
99
+ // (currently the magic import is injected into any type of module, not only JS)
100
+ // not sure if it's necessary to inject the Wix SDK context into the client bundle
101
+ // wixSDKContext(),
102
+ ],
103
+ },
104
+ image: setImageConfig(args?.imageService ?? "DEFAULT", config.image, command, logger),
105
+ });
106
+ },
107
+ "astro:config:done": async ({ setAdapter, config }) => {
108
+ _config = config;
109
+ if (config.output === "static") {
110
+ throw new AstroError('[@astrojs/cloudflare] `output: "server"` or `output: "hybrid"` is required to use this adapter. Otherwise, this adapter is not necessary to deploy a static site to Cloudflare.');
111
+ }
112
+ setAdapter({
113
+ name: "@astrojs/wix",
114
+ serverEntrypoint: createRequire(import.meta.url).resolve("./entrypoints/server"),
115
+ exports: ["default"],
116
+ adapterFeatures: {
117
+ functionPerRoute: false,
118
+ edgeMiddleware: false,
119
+ },
120
+ supportedAstroFeatures: {
121
+ serverOutput: "stable",
122
+ hybridOutput: "stable",
123
+ staticOutput: "unsupported",
124
+ i18nDomains: "experimental",
125
+ assets: {
126
+ supportKind: "stable",
127
+ isSharpCompatible: false,
128
+ isSquooshCompatible: false,
129
+ },
130
+ },
131
+ });
132
+ },
133
+ "astro:build:setup": ({ vite, target }) => {
134
+ if (target === "server") {
135
+ vite.resolve ||= {};
136
+ vite.resolve.alias ||= {};
137
+ const aliases = [
138
+ {
139
+ find: "react-dom/server",
140
+ replacement: "react-dom/server.browser",
141
+ },
142
+ ];
143
+ if (Array.isArray(vite.resolve.alias)) {
144
+ vite.resolve.alias = [...vite.resolve.alias, ...aliases];
145
+ }
146
+ else {
147
+ for (const alias of aliases) {
148
+ vite.resolve.alias[alias.find] =
149
+ alias.replacement;
150
+ }
151
+ }
152
+ vite.resolve.conditions ||= [];
153
+ // We need those conditions, previous these conditions where applied at the esbuild step which we removed
154
+ // https://github.com/withastro/astro/pull/7092
155
+ vite.resolve.conditions.push("workerd", "worker");
156
+ vite.ssr ||= {};
157
+ vite.ssr.target = "webworker";
158
+ vite.ssr.noExternal = true;
159
+ if (typeof _config.vite.ssr?.external === "undefined")
160
+ vite.ssr.external = ["node:async_hooks"];
161
+ if (typeof _config.vite.ssr?.external === "boolean")
162
+ vite.ssr.external = _config.vite.ssr?.external;
163
+ if (Array.isArray(_config.vite.ssr?.external)) {
164
+ // `@astrojs/vue` sets `@vue/server-renderer` to external
165
+ // https://github.com/withastro/astro/blob/e648c5575a8774af739231cfa9fc27a32086aa5f/packages/integrations/vue/src/index.ts#L119
166
+ // the cloudflare adapter needs to get all dependencies inlined, we use `noExternal` for that, but any `external` config overrides that
167
+ // therefore we need to remove `@vue/server-renderer` from the external config again
168
+ vite.ssr.external = _config.vite.ssr?.external.filter((entry) => entry !== "@vue/server-renderer");
169
+ vite.ssr.external.push("node:async_hooks");
170
+ }
171
+ vite.build ||= {};
172
+ vite.build.rollupOptions ||= {};
173
+ vite.build.rollupOptions.output ||= {};
174
+ // @ts-expect-error
175
+ vite.build.rollupOptions.output.banner ||=
176
+ "globalThis.process ??= {}; globalThis.process.env ??= {};";
177
+ vite.build.rollupOptions.external =
178
+ _config.vite.build?.rollupOptions?.external ?? [];
179
+ // @ts-expect-error
180
+ vite.build.rollupOptions.external.push("__STATIC_CONTENT_MANIFEST");
181
+ // Cloudflare env is only available per request. This isn't feasible for code that access env vars
182
+ // in a global way, so we shim their access as `process.env.*`. This is not the recommended way for users to access environment variables. But we'll add this for compatibility for chosen variables. Mainly to support `@astrojs/db`
183
+ vite.define = {
184
+ "process.env": "process.env",
185
+ ...vite.define,
186
+ };
187
+ }
188
+ // we thought that vite config inside `if (target === 'server')` would not apply for client
189
+ // but it seems like the same `vite` reference is used for both
190
+ // so we need to reset the previous conflicting setting
191
+ // in the future we should look into a more robust solution
192
+ if (target === "client") {
193
+ vite.resolve ||= {};
194
+ vite.resolve.conditions ||= [];
195
+ vite.resolve.conditions = vite.resolve.conditions.filter((c) => c !== "workerd" && c !== "worker");
196
+ }
197
+ },
198
+ "astro:build:done": async ({ pages, routes, dir, logger }) => {
199
+ const PLATFORM_FILES = ["_headers", "_redirects", "_routes.json"];
200
+ if (_config.base !== "/") {
201
+ for (const file of PLATFORM_FILES) {
202
+ try {
203
+ await rename(new URL(file, _config.build.client), new URL(file, _config.outDir));
204
+ }
205
+ catch (e) {
206
+ logger.error(`There was an error moving ${file} to the root of the output directory.`);
207
+ }
208
+ }
209
+ }
210
+ let redirectsExists = false;
211
+ try {
212
+ const redirectsStat = await stat(new URL("./_redirects", _config.outDir));
213
+ if (redirectsStat.isFile()) {
214
+ redirectsExists = true;
215
+ }
216
+ }
217
+ catch (error) {
218
+ redirectsExists = false;
219
+ }
220
+ const redirects = [];
221
+ if (redirectsExists) {
222
+ const rl = createInterface({
223
+ input: createReadStream(new URL("./_redirects", _config.outDir)),
224
+ crlfDelay: Number.POSITIVE_INFINITY,
225
+ });
226
+ for await (const line of rl) {
227
+ const parts = line.split(" ");
228
+ if (parts.length >= 2) {
229
+ const p = removeLeadingForwardSlash(parts[0])
230
+ .split("/")
231
+ .filter(Boolean)
232
+ .map((s) => {
233
+ const syntax = s
234
+ .replace(/\/:.*?(?=\/|$)/g, "/*")
235
+ // remove query params as they are not supported by cloudflare
236
+ .replace(/\?.*$/, "");
237
+ return getParts(syntax);
238
+ });
239
+ redirects.push(p);
240
+ }
241
+ }
242
+ }
243
+ let routesExists = false;
244
+ try {
245
+ const routesStat = await stat(new URL("./_routes.json", _config.outDir));
246
+ if (routesStat.isFile()) {
247
+ routesExists = true;
248
+ }
249
+ }
250
+ catch (error) {
251
+ routesExists = false;
252
+ }
253
+ if (!routesExists) {
254
+ await createRoutesFile(_config, logger, routes, pages, redirects, args?.routes?.extend?.include, args?.routes?.extend?.exclude);
255
+ }
256
+ const redirectRoutes = [];
257
+ for (const route of routes) {
258
+ if (route.type === "redirect")
259
+ redirectRoutes.push([route, ""]);
260
+ }
261
+ const trueRedirects = createRedirectsFromAstroRoutes({
262
+ config: _config,
263
+ routeToDynamicTargetMap: new Map(Array.from(redirectRoutes)),
264
+ dir,
265
+ });
266
+ if (!trueRedirects.empty()) {
267
+ try {
268
+ await appendFile(new URL("./_redirects", _config.outDir), trueRedirects.print());
269
+ }
270
+ catch (error) {
271
+ logger.error("Failed to write _redirects file");
272
+ }
273
+ }
274
+ // Get chunks from the bundle that are not needed on the server and delete them
275
+ // Those modules are build only for prerendering routes.
276
+ const chunksToDelete = chunkAnalyzer.getNonServerChunks();
277
+ for (const chunk of chunksToDelete) {
278
+ try {
279
+ // Chunks are located on `./_worker.js` directory inside of the output directory
280
+ await unlink(new URL(`./_worker.js/${chunk}`, _config.outDir));
281
+ }
282
+ catch (error) {
283
+ logger.warn(`Issue while trying to delete unused file from server bundle: ${new URL(`./_worker.js/${chunk}`, _config.outDir).toString()}`);
284
+ }
285
+ }
286
+ },
287
+ },
288
+ };
289
+ }
290
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIseUJBQXlCLEdBQzFCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUNMLCtCQUErQixFQUMvQixvQkFBb0IsR0FDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFtQ3pDLE1BQU0sQ0FBQyxPQUFPLFVBQVUsaUJBQWlCLENBQUMsSUFB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
@@ -0,0 +1,2 @@
1
+ import type { MiddlewareHandler } from "astro";
2
+ export declare const onRequest: MiddlewareHandler;