create-cloudflare 2.11.3 → 2.12.0

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.
@@ -0,0 +1,58 @@
1
+ export const runtime = "edge";
2
+
3
+ export default function NotFound() {
4
+ return (
5
+ <>
6
+ <title>404: This page could not be found.</title>
7
+ <div style={styles.error}>
8
+ <div>
9
+ <style
10
+ dangerouslySetInnerHTML={{
11
+ __html: `body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}`,
12
+ }}
13
+ />
14
+ <h1 className="next-error-h1" style={styles.h1}>
15
+ 404
16
+ </h1>
17
+ <div style={styles.desc}>
18
+ <h2 style={styles.h2}>This page could not be found.</h2>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </>
23
+ );
24
+ }
25
+
26
+ const styles = {
27
+ error: {
28
+ fontFamily:
29
+ 'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',
30
+ height: "100vh",
31
+ textAlign: "center",
32
+ display: "flex",
33
+ flexDirection: "column",
34
+ alignItems: "center",
35
+ justifyContent: "center",
36
+ },
37
+
38
+ desc: {
39
+ display: "inline-block",
40
+ },
41
+
42
+ h1: {
43
+ display: "inline-block",
44
+ margin: "0 20px 0 0",
45
+ padding: "0 23px 0 0",
46
+ fontSize: 24,
47
+ fontWeight: 500,
48
+ verticalAlign: "top",
49
+ lineHeight: "49px",
50
+ },
51
+
52
+ h2: {
53
+ fontSize: 14,
54
+ fontWeight: 400,
55
+ lineHeight: "49px",
56
+ margin: 0,
57
+ },
58
+ };
@@ -0,0 +1,22 @@
1
+ import type { NextRequest } from 'next/server'
2
+ import { getRequestContext } from '@cloudflare/next-on-pages'
3
+
4
+ export const runtime = 'edge'
5
+
6
+ export async function GET(request: NextRequest) {
7
+ let responseText = 'Hello World'
8
+
9
+ // In the edge runtime you can use Bindings that are available in your application
10
+ // (for more details see:
11
+ // - https://developers.cloudflare.com/pages/framework-guides/deploy-a-nextjs-site/#use-bindings-in-your-nextjs-application
12
+ // - https://developers.cloudflare.com/pages/functions/bindings/
13
+ // )
14
+ //
15
+ // KV Example:
16
+ // const myKv = getRequestContext().env.MY_KV
17
+ // await myKv.put('suffix', ' from a KV store!')
18
+ // const suffix = await myKv.get('suffix')
19
+ // responseText += suffix
20
+
21
+ return new Response(responseText)
22
+ }
@@ -0,0 +1,58 @@
1
+ export const runtime = "edge";
2
+
3
+ export default function NotFound() {
4
+ return (
5
+ <>
6
+ <title>404: This page could not be found.</title>
7
+ <div style={styles.error}>
8
+ <div>
9
+ <style
10
+ dangerouslySetInnerHTML={{
11
+ __html: `body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}`,
12
+ }}
13
+ />
14
+ <h1 className="next-error-h1" style={styles.h1}>
15
+ 404
16
+ </h1>
17
+ <div style={styles.desc}>
18
+ <h2 style={styles.h2}>This page could not be found.</h2>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </>
23
+ );
24
+ }
25
+
26
+ const styles = {
27
+ error: {
28
+ fontFamily:
29
+ 'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',
30
+ height: "100vh",
31
+ textAlign: "center",
32
+ display: "flex",
33
+ flexDirection: "column",
34
+ alignItems: "center",
35
+ justifyContent: "center",
36
+ },
37
+
38
+ desc: {
39
+ display: "inline-block",
40
+ },
41
+
42
+ h1: {
43
+ display: "inline-block",
44
+ margin: "0 20px 0 0",
45
+ padding: "0 23px 0 0",
46
+ fontSize: 24,
47
+ fontWeight: 500,
48
+ verticalAlign: "top",
49
+ lineHeight: "49px",
50
+ },
51
+
52
+ h2: {
53
+ fontSize: 14,
54
+ fontWeight: 400,
55
+ lineHeight: "49px",
56
+ margin: 0,
57
+ },
58
+ } as const;
@@ -1,11 +1,13 @@
1
- import { existsSync, mkdirSync } from "fs";
1
+ import { join } from "path";
2
2
  import { crash, updateStatus, warn } from "@cloudflare/cli";
3
3
  import { processArgument } from "@cloudflare/cli/args";
4
4
  import { brandColor, dim } from "@cloudflare/cli/colors";
5
+ import { spinner } from "@cloudflare/cli/interactive";
5
6
  import { installPackages, runFrameworkGenerator } from "helpers/command";
6
7
  import {
7
- compatDateFlag,
8
+ copyFile,
8
9
  probePaths,
10
+ readFile,
9
11
  readJSON,
10
12
  usesEslint,
11
13
  usesTypescript,
@@ -13,17 +15,7 @@ import {
13
15
  writeJSON,
14
16
  } from "helpers/files";
15
17
  import { detectPackageManager } from "helpers/packages";
16
- import {
17
- apiAppDirHelloJs,
18
- apiAppDirHelloTs,
19
- apiPagesDirHelloJs,
20
- apiPagesDirHelloTs,
21
- appDirNotFoundJs,
22
- appDirNotFoundTs,
23
- envDts,
24
- nextConfig,
25
- readme,
26
- } from "./templates";
18
+ import { getTemplatePath } from "../../src/templates";
27
19
  import type { TemplateConfig } from "../../src/templates";
28
20
  import type { C3Args, C3Context } from "types";
29
21
 
@@ -33,27 +25,37 @@ const generate = async (ctx: C3Context) => {
33
25
  const projectName = ctx.project.name;
34
26
 
35
27
  await runFrameworkGenerator(ctx, [projectName]);
28
+
29
+ copyFile(
30
+ join(getTemplatePath(ctx), "wrangler.toml"),
31
+ join(ctx.project.path, "wrangler.toml")
32
+ );
33
+ updateStatus("Created wrangler.toml file");
36
34
  };
37
35
 
38
- const getApiTemplate = (
39
- apiPath: string,
40
- isTypescript: boolean
41
- ): [string, string] => {
42
- const isAppDir = /\/app\/api$/.test(apiPath);
36
+ const updateNextConfig = () => {
37
+ const s = spinner();
43
38
 
44
- if (isAppDir) {
45
- // App directory uses route handlers that are defined in a subdirectory (`/api/hello/route.ts`).
46
- const routeHandlerPath = `${apiPath}/hello`;
47
- mkdirSync(routeHandlerPath, { recursive: true });
39
+ const configFile = "next.config.mjs";
40
+ s.start(`Updating \`${configFile}\``);
48
41
 
49
- return isTypescript
50
- ? [`${routeHandlerPath}/route.ts`, apiAppDirHelloTs]
51
- : [`${routeHandlerPath}/route.js`, apiAppDirHelloJs];
52
- }
42
+ const configContent = readFile(configFile);
43
+
44
+ const updatedConfigFile =
45
+ `import { setupDevPlatform } from '@cloudflare/next-on-pages/next-dev';
46
+
47
+ // Here we use the @cloudflare/next-on-pages next-dev module to allow us to use bindings during local development
48
+ // (when running the application with \`next dev\`), for more information see:
49
+ // https://github.com/cloudflare/next-on-pages/blob/5712c57ea7/internal-packages/next-dev/README.md
50
+ if (process.env.NODE_ENV === 'development') {
51
+ await setupDevPlatform();
52
+ }
53
53
 
54
- return isTypescript
55
- ? [`${apiPath}/hello.ts`, apiPagesDirHelloTs]
56
- : [`${apiPath}/hello.js`, apiPagesDirHelloJs];
54
+ `.replace(/\n\t*/g, "\n") + configContent;
55
+
56
+ writeFile(configFile, updatedConfigFile);
57
+
58
+ s.stop(`${brandColor(`updated`)} ${dim(`\`${configFile}\``)}`);
57
59
  };
58
60
 
59
61
  const configure = async (ctx: C3Context) => {
@@ -73,36 +75,13 @@ const configure = async (ctx: C3Context) => {
73
75
  crash("Could not find the `/api` or `/app` directory");
74
76
  }
75
77
 
76
- // App directory template may not generate an API route handler, so we update the path to add an `api` directory.
77
- const apiPath = path.replace(/\/app$/, "/app/api");
78
-
79
78
  const usesTs = usesTypescript(ctx);
80
79
 
81
- const appDirPath = probePaths([
82
- `${projectPath}/src/app`,
83
- `${projectPath}/app`,
84
- ]);
85
-
86
- if (appDirPath) {
87
- // Add a custom app not-found edge route as recommended in next-on-pages
88
- // (see: https://github.com/cloudflare/next-on-pages/blob/2b5c8f25/packages/next-on-pages/docs/gotchas.md#not-found)
89
- const notFoundPath = `${appDirPath}/not-found.${usesTs ? "tsx" : "js"}`;
90
- if (!existsSync(notFoundPath)) {
91
- const notFoundContent = usesTs ? appDirNotFoundTs : appDirNotFoundJs;
92
- writeFile(notFoundPath, notFoundContent);
93
- updateStatus("Created a custom edge not-found route");
94
- }
95
- }
96
-
97
- const [handlerPath, handlerFile] = getApiTemplate(
98
- apiPath,
99
- usesTypescript(ctx)
100
- );
101
- writeFile(handlerPath, handlerFile);
102
- updateStatus("Created an example API route handler");
103
-
104
80
  if (usesTs) {
105
- writeFile(`${projectPath}/env.d.ts`, envDts);
81
+ copyFile(
82
+ join(getTemplatePath(ctx), "env.d.ts"),
83
+ join(projectPath, "env.d.ts")
84
+ );
106
85
  updateStatus("Created an env.d.ts file");
107
86
  }
108
87
 
@@ -112,10 +91,12 @@ const configure = async (ctx: C3Context) => {
112
91
  await writeEslintrc(ctx);
113
92
  }
114
93
 
115
- writeFile(`${projectPath}/next.config.mjs`, nextConfig);
116
- updateStatus("Updated the next.config.js file");
94
+ updateNextConfig();
117
95
 
118
- writeFile(`${projectPath}/README.md`, readme);
96
+ copyFile(
97
+ join(getTemplatePath(ctx), "README.md"),
98
+ join(projectPath, "README.md")
99
+ );
119
100
  updateStatus("Updated the README file");
120
101
 
121
102
  await addDevDependencies(installEslintPlugin);
@@ -178,9 +159,41 @@ export default {
178
159
  platform: "pages",
179
160
  displayName: "Next",
180
161
  devScript: "dev",
181
- previewScript: "pages:preview",
162
+ previewScript: "preview",
163
+ deployScript: "deploy",
182
164
  generate,
183
165
  configure,
166
+ copyFiles: {
167
+ async selectVariant(ctx) {
168
+ const isApp = probePaths([
169
+ `${ctx.project.path}/src/app`,
170
+ `${ctx.project.path}/app`,
171
+ ]);
172
+
173
+ const isTypescript = usesTypescript(ctx);
174
+
175
+ const dir = isApp ? "app" : "pages";
176
+ return `${dir}/${isTypescript ? "ts" : "js"}`;
177
+ },
178
+ destinationDir(ctx) {
179
+ const srcPath = probePaths([`${ctx.project.path}/src`]);
180
+ return srcPath ? "./src" : "./";
181
+ },
182
+ variants: {
183
+ "app/ts": {
184
+ path: "./app/ts",
185
+ },
186
+ "app/js": {
187
+ path: "./app/js",
188
+ },
189
+ "pages/ts": {
190
+ path: "./pages/ts",
191
+ },
192
+ "pages/js": {
193
+ path: "./pages/js",
194
+ },
195
+ },
196
+ },
184
197
  transformPackageJson: async () => {
185
198
  const isNpm = npm === "npm";
186
199
  const isBun = npm === "bun";
@@ -194,8 +207,8 @@ export default {
194
207
  return {
195
208
  scripts: {
196
209
  "pages:build": `${pmCommand} ${nextOnPagesCommand}`,
197
- "pages:preview": `${pagesBuildRunCommand} && wrangler pages dev .vercel/output/static ${await compatDateFlag()} --compatibility-flag=nodejs_compat`,
198
- "pages:deploy": `${pagesBuildRunCommand} && wrangler pages deploy .vercel/output/static`,
210
+ preview: `${pagesBuildRunCommand} && wrangler pages dev .vercel/output/static`,
211
+ deploy: `${pagesBuildRunCommand} && wrangler pages deploy .vercel/output/static`,
199
212
  },
200
213
  };
201
214
  },
@@ -0,0 +1,7 @@
1
+ interface CloudflareEnv {
2
+ // Add here the Cloudflare Bindings you want to have available in your application
3
+ // (for more details on Bindings see: https://developers.cloudflare.com/pages/functions/bindings/)
4
+ //
5
+ // KV Example:
6
+ // MY_KV: KVNamespace
7
+ }
@@ -0,0 +1,23 @@
1
+ import { getRequestContext } from '@cloudflare/next-on-pages'
2
+
3
+ export const config = {
4
+ runtime: 'edge',
5
+ }
6
+
7
+ export default async function handler(req) {
8
+ let responseText = 'Hello World'
9
+
10
+ // In the edge runtime you can use Bindings that are available in your application
11
+ // (for more details see:
12
+ // - https://developers.cloudflare.com/pages/framework-guides/deploy-a-nextjs-site/#use-bindings-in-your-nextjs-application
13
+ // - https://developers.cloudflare.com/pages/functions/bindings/
14
+ // )
15
+ //
16
+ // KV Example:
17
+ // const myKv = getRequestContext().env.MY_KV
18
+ // await myKv.put('suffix', ' from a KV store!')
19
+ // const suffix = await myKv.get('suffix')
20
+ // responseText += suffix
21
+
22
+ return new Response(responseText)
23
+ }
@@ -0,0 +1,24 @@
1
+ import type { NextRequest } from 'next/server'
2
+ import { getRequestContext } from '@cloudflare/next-on-pages'
3
+
4
+ export const config = {
5
+ runtime: 'edge',
6
+ }
7
+
8
+ export default async function handler(req: NextRequest) {
9
+ let responseText = 'Hello World'
10
+
11
+ // In the edge runtime you can use Bindings that are available in your application
12
+ // (for more details see:
13
+ // - https://developers.cloudflare.com/pages/framework-guides/deploy-a-nextjs-site/#use-bindings-in-your-nextjs-application
14
+ // - https://developers.cloudflare.com/pages/functions/bindings/
15
+ // )
16
+ //
17
+ // KV Example:
18
+ // const myKv = getRequestContext().env.MY_KV;
19
+ // await myKv.put('suffix', ' from a KV store!')
20
+ // const suffix = await myKv.get('suffix')
21
+ // responseText += suffix
22
+
23
+ return new Response(responseText)
24
+ }
@@ -0,0 +1,57 @@
1
+ name = "<TBD>"
2
+ compatibility_date = "<TBD>"
3
+
4
+ compatibility_flags = ["nodejs_compat"]
5
+
6
+ # Variable bindings. These are arbitrary, plaintext strings (similar to environment variables)
7
+ # Note: Use secrets to store sensitive data.
8
+ # Docs: https://developers.cloudflare.com/workers/platform/environment-variables
9
+ # [vars]
10
+ # MY_VARIABLE = "production_value"
11
+
12
+ # Bind a KV Namespace. Use KV as persistent storage for small key-value pairs.
13
+ # Docs: https://developers.cloudflare.com/workers/runtime-apis/kv
14
+ # [[kv_namespaces]]
15
+ # binding = "MY_KV_NAMESPACE"
16
+ # id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
17
+
18
+ # Bind an R2 Bucket. Use R2 to store arbitrarily large blobs of data, such as files.
19
+ # Docs: https://developers.cloudflare.com/r2/api/workers/workers-api-usage/
20
+ # [[r2_buckets]]
21
+ # binding = "MY_BUCKET"
22
+ # bucket_name = "my-bucket"
23
+
24
+ # Bind a Queue producer. Use this binding to schedule an arbitrary task that may be processed later by a Queue consumer.
25
+ # Docs: https://developers.cloudflare.com/queues/get-started
26
+ # [[queues.producers]]
27
+ # binding = "MY_QUEUE"
28
+ # queue = "my-queue"
29
+
30
+ # Bind a Queue consumer. Queue Consumers can retrieve tasks scheduled by Producers to act on them.
31
+ # Docs: https://developers.cloudflare.com/queues/get-started
32
+ # [[queues.consumers]]
33
+ # queue = "my-queue"
34
+
35
+ # Bind another Worker service. Use this binding to call another Worker without network overhead.
36
+ # Docs: https://developers.cloudflare.com/workers/platform/services
37
+ # [[services]]
38
+ # binding = "MY_SERVICE"
39
+ # service = "my-service"
40
+
41
+ # Bind a Durable Object. Durable objects are a scale-to-zero compute primitive based on the actor model.
42
+ # Durable Objects can live for as long as needed. Use these when you need a long-running "server", such as in realtime apps.
43
+ # Docs: https://developers.cloudflare.com/workers/runtime-apis/durable-objects
44
+ # [[durable_objects.bindings]]
45
+ # name = "MY_DURABLE_OBJECT"
46
+ # class_name = "MyDurableObject"
47
+
48
+ # Durable Object migrations.
49
+ # Docs: https://developers.cloudflare.com/workers/learning/using-durable-objects#configure-durable-object-classes-with-migrations
50
+ # [[migrations]]
51
+ # tag = "v1"
52
+ # new_classes = ["MyDurableObject"]
53
+
54
+ # KV Example:
55
+ # [[kv_namespaces]]
56
+ # binding = "MY_KV"
57
+ # id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
@@ -1,11 +1,11 @@
1
- import { readFileSync } from "node:fs";
2
- import { resolve } from "node:path";
3
1
  import { logRaw } from "@cloudflare/cli";
4
2
  import { brandColor, dim } from "@cloudflare/cli/colors";
5
3
  import { spinner } from "@cloudflare/cli/interactive";
6
- import { runFrameworkGenerator } from "helpers/command";
7
- import { compatDateFlag, writeFile } from "helpers/files";
4
+ import { transformFile } from "helpers/codemod";
5
+ import { installPackages, runFrameworkGenerator } from "helpers/command";
6
+ import { writeFile } from "helpers/files";
8
7
  import { detectPackageManager } from "helpers/packages";
8
+ import * as recast from "recast";
9
9
  import type { TemplateConfig } from "../../src/templates";
10
10
  import type { C3Context } from "types";
11
11
 
@@ -28,31 +28,71 @@ const generate = async (ctx: C3Context) => {
28
28
  };
29
29
 
30
30
  const configure = async () => {
31
- const configFileName = "nuxt.config.ts";
32
- const configFilePath = resolve(configFileName);
31
+ await installPackages(["nitro-cloudflare-dev"], {
32
+ dev: true,
33
+ startText: "Installing nitro module `nitro-cloudflare-dev`",
34
+ doneText: `${brandColor("installed")} ${dim(`via \`${npm} install\``)}`,
35
+ });
36
+ updateNuxtConfig();
37
+ };
38
+
39
+ const updateNuxtConfig = () => {
33
40
  const s = spinner();
34
- s.start(`Updating \`${configFileName}\``);
35
- // Add the cloudflare preset into the configuration file.
36
- const originalConfigFile = readFileSync(configFilePath, "utf8");
37
- const updatedConfigFile = originalConfigFile.replace(
38
- "defineNuxtConfig({",
39
- "defineNuxtConfig({\n nitro: {\n preset: 'cloudflare-pages'\n },"
41
+
42
+ const configFile = "nuxt.config.ts";
43
+ s.start(`Updating \`${configFile}\``);
44
+
45
+ const b = recast.types.builders;
46
+
47
+ const presetDef = b.objectProperty(
48
+ b.identifier("nitro"),
49
+ b.objectExpression([
50
+ b.objectProperty(
51
+ b.identifier("preset"),
52
+ b.stringLiteral("cloudflare-pages")
53
+ ),
54
+ ])
55
+ );
56
+
57
+ const moduleDef = b.objectProperty(
58
+ b.identifier("modules"),
59
+ b.arrayExpression([b.stringLiteral("nitro-cloudflare-dev")])
40
60
  );
41
- writeFile(configFilePath, updatedConfigFile);
42
- s.stop(`${brandColor(`updated`)} ${dim(`\`${configFileName}\``)}`);
61
+
62
+ transformFile(configFile, {
63
+ visitCallExpression: function (n) {
64
+ const callee = n.node.callee as recast.types.namedTypes.Identifier;
65
+ if (callee.name === "defineNuxtConfig") {
66
+ const obj = n.node
67
+ .arguments[0] as recast.types.namedTypes.ObjectExpression;
68
+
69
+ obj.properties.push(presetDef);
70
+ obj.properties.push(moduleDef);
71
+ }
72
+
73
+ return this.traverse(n);
74
+ },
75
+ });
76
+
77
+ s.stop(`${brandColor(`updated`)} ${dim(`\`${configFile}\``)}`);
43
78
  };
44
79
 
45
80
  const config: TemplateConfig = {
46
81
  configVersion: 1,
47
82
  id: "nuxt",
48
83
  platform: "pages",
84
+ copyFiles: {
85
+ path: "./templates",
86
+ },
49
87
  displayName: "Nuxt",
88
+ devScript: "dev",
89
+ deployScript: "deploy",
50
90
  generate,
51
91
  configure,
52
92
  transformPackageJson: async () => ({
53
93
  scripts: {
54
- "pages:dev": `wrangler pages dev ${await compatDateFlag()} --proxy 3000 -- ${npm} run dev`,
55
- "pages:deploy": `${npm} run build && wrangler pages deploy ./dist`,
94
+ deploy: `${npm} run build && wrangler pages deploy ./dist`,
95
+ preview: `${npm} run build && wrangler pages dev ./dist`,
56
96
  },
57
97
  }),
58
98
  };
@@ -0,0 +1,50 @@
1
+ name = "<TBD>"
2
+ compatibility_date = "<TBD>"
3
+
4
+ # Variable bindings. These are arbitrary, plaintext strings (similar to environment variables)
5
+ # Note: Use secrets to store sensitive data.
6
+ # Docs: https://developers.cloudflare.com/workers/platform/environment-variables
7
+ # [vars]
8
+ # MY_VARIABLE = "production_value"
9
+
10
+ # Bind a KV Namespace. Use KV as persistent storage for small key-value pairs.
11
+ # Docs: https://developers.cloudflare.com/workers/runtime-apis/kv
12
+ # [[kv_namespaces]]
13
+ # binding = "MY_KV_NAMESPACE"
14
+ # id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
15
+
16
+ # Bind an R2 Bucket. Use R2 to store arbitrarily large blobs of data, such as files.
17
+ # Docs: https://developers.cloudflare.com/r2/api/workers/workers-api-usage/
18
+ # [[r2_buckets]]
19
+ # binding = "MY_BUCKET"
20
+ # bucket_name = "my-bucket"
21
+
22
+ # Bind a Queue producer. Use this binding to schedule an arbitrary task that may be processed later by a Queue consumer.
23
+ # Docs: https://developers.cloudflare.com/queues/get-started
24
+ # [[queues.producers]]
25
+ # binding = "MY_QUEUE"
26
+ # queue = "my-queue"
27
+
28
+ # Bind a Queue consumer. Queue Consumers can retrieve tasks scheduled by Producers to act on them.
29
+ # Docs: https://developers.cloudflare.com/queues/get-started
30
+ # [[queues.consumers]]
31
+ # queue = "my-queue"
32
+
33
+ # Bind another Worker service. Use this binding to call another Worker without network overhead.
34
+ # Docs: https://developers.cloudflare.com/workers/platform/services
35
+ # [[services]]
36
+ # binding = "MY_SERVICE"
37
+ # service = "my-service"
38
+
39
+ # Bind a Durable Object. Durable objects are a scale-to-zero compute primitive based on the actor model.
40
+ # Durable Objects can live for as long as needed. Use these when you need a long-running "server", such as in realtime apps.
41
+ # Docs: https://developers.cloudflare.com/workers/runtime-apis/durable-objects
42
+ # [[durable_objects.bindings]]
43
+ # name = "MY_DURABLE_OBJECT"
44
+ # class_name = "MyDurableObject"
45
+
46
+ # Durable Object migrations.
47
+ # Docs: https://developers.cloudflare.com/workers/learning/using-durable-objects#configure-durable-object-classes-with-migrations
48
+ # [[migrations]]
49
+ # tag = "v1"
50
+ # new_classes = ["MyDurableObject"]
@@ -4,11 +4,13 @@ export default {
4
4
  displayName: "Queue consumer & producer Worker",
5
5
  platform: "workers",
6
6
  copyFiles: {
7
- js: {
8
- path: "./js",
9
- },
10
- ts: {
11
- path: "./ts",
7
+ variants: {
8
+ js: {
9
+ path: "./js",
10
+ },
11
+ ts: {
12
+ path: "./ts",
13
+ },
12
14
  },
13
15
  },
14
16
  bindings: {
@@ -40,9 +40,9 @@ const addBindingsProxy = (ctx: C3Context) => {
40
40
  let env = {};
41
41
 
42
42
  if(process.env.NODE_ENV === 'development') {
43
- const { getBindingsProxy } = await import('wrangler');
44
- const { bindings } = await getBindingsProxy();
45
- env = bindings;
43
+ const { getPlatformProxy } = await import('wrangler');
44
+ const platformProxy = await getPlatformProxy();
45
+ env = platformProxy.env;
46
46
  }
47
47
  `;
48
48
 
@@ -79,6 +79,9 @@ const config: TemplateConfig = {
79
79
  id: "qwik",
80
80
  displayName: "Qwik",
81
81
  platform: "pages",
82
+ copyFiles: {
83
+ path: "./templates",
84
+ },
82
85
  devScript: "dev",
83
86
  deployScript: "deploy",
84
87
  generate,