create-cloudflare 0.0.0-fa09f4a2 → 0.0.0-fa42550d

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 (62) hide show
  1. package/dist/cli.js +73215 -58937
  2. package/package.json +12 -7
  3. package/templates/angular/c3.ts +98 -0
  4. package/{dist → templates}/angular/templates/tools/copy-files.mjs +1 -1
  5. package/templates/astro/c3.ts +111 -0
  6. package/templates/astro/snippets/runtimeDeclaration.ts +4 -0
  7. package/templates/astro/templates/wrangler.toml +50 -0
  8. package/templates/common/c3.ts +16 -0
  9. package/templates/docusaurus/c3.ts +26 -0
  10. package/templates/gatsby/c3.ts +48 -0
  11. package/templates/hello-world/c3.ts +16 -0
  12. package/templates/hello-world-durable-object/c3.ts +16 -0
  13. package/templates/hono/c3.ts +25 -0
  14. package/templates/next/README.md +58 -0
  15. package/templates/next/app/js/app/api/hello/route.js +21 -0
  16. package/templates/next/app/js/app/not-found.js +58 -0
  17. package/templates/next/app/ts/app/api/hello/route.ts +22 -0
  18. package/templates/next/app/ts/app/not-found.tsx +58 -0
  19. package/templates/next/c3.ts +216 -0
  20. package/templates/next/env.d.ts +7 -0
  21. package/templates/next/pages/js/pages/api/hello.js +23 -0
  22. package/templates/next/pages/ts/pages/api/hello.ts +24 -0
  23. package/templates/next/wrangler.toml +57 -0
  24. package/templates/nuxt/c3.ts +133 -0
  25. package/templates/nuxt/templates/env.d.ts +14 -0
  26. package/templates/nuxt/templates/worker-configuration.d.ts +3 -0
  27. package/templates/nuxt/templates/wrangler.toml +50 -0
  28. package/templates/openapi/c3.ts +9 -0
  29. package/templates/openapi/ts/src/endpoints/taskList.ts +1 -1
  30. package/templates/openapi/ts/src/index.ts +2 -2
  31. package/templates/pre-existing/c3.ts +83 -0
  32. package/templates/pre-existing/js/.editorconfig +13 -0
  33. package/templates/pre-existing/js/.prettierrc +6 -0
  34. package/templates/{chatgptPlugin/ts → pre-existing/js}/__dot__gitignore +1 -0
  35. package/templates/{chatgptPlugin/ts → pre-existing/js}/package.json +2 -5
  36. package/templates/pre-existing/js/wrangler.toml +3 -0
  37. package/templates/queues/c3.ts +26 -0
  38. package/templates/qwik/c3.ts +146 -0
  39. package/templates/qwik/snippets/getPlatformProxy.ts +6 -0
  40. package/templates/qwik/templates/worker-configuration.d.ts +3 -0
  41. package/templates/qwik/templates/wrangler.toml +50 -0
  42. package/templates/react/c3.ts +31 -0
  43. package/templates/remix/c3.ts +66 -0
  44. package/templates/remix/templates/worker-configuration.d.ts +3 -0
  45. package/templates/remix/templates/wrangler.toml +50 -0
  46. package/templates/scheduled/c3.ts +16 -0
  47. package/templates/solid/c3.ts +81 -0
  48. package/templates/svelte/c3.ts +129 -0
  49. package/templates/svelte/js/src/hooks.server.js +25 -0
  50. package/templates/svelte/js/wrangler.toml +50 -0
  51. package/templates/svelte/ts/src/hooks.server.ts +24 -0
  52. package/templates/svelte/ts/wrangler.toml +50 -0
  53. package/templates/vue/c3.ts +28 -0
  54. package/templates/chatgptPlugin/ts/.assets/example.png +0 -0
  55. package/templates/chatgptPlugin/ts/README.md +0 -25
  56. package/templates/chatgptPlugin/ts/src/index.ts +0 -33
  57. package/templates/chatgptPlugin/ts/src/search.ts +0 -59
  58. package/templates/chatgptPlugin/ts/wrangler.toml +0 -3
  59. package/{dist → templates}/angular/templates/server.ts +0 -0
  60. package/{dist → templates}/angular/templates/src/_routes.json +0 -0
  61. package/{dist → templates}/angular/templates/tools/alter-polyfills.mjs +1 -1
  62. /package/{dist → templates}/angular/templates/tools/paths.mjs +0 -0
@@ -0,0 +1,83 @@
1
+ import { cp, mkdtemp } from "fs/promises";
2
+ import { tmpdir } from "os";
3
+ import { join } from "path";
4
+ import { processArgument } from "@cloudflare/cli/args";
5
+ import { brandColor, dim } from "@cloudflare/cli/colors";
6
+ import { runCommand } from "helpers/command";
7
+ import { detectPackageManager } from "helpers/packages";
8
+ import { chooseAccount } from "../../src/common";
9
+ import type { C3Context } from "types";
10
+
11
+ export async function copyExistingWorkerFiles(ctx: C3Context) {
12
+ const { dlx } = detectPackageManager();
13
+
14
+ await chooseAccount(ctx);
15
+
16
+ if (ctx.args.existingScript === undefined) {
17
+ ctx.args.existingScript = await processArgument<string>(
18
+ ctx.args,
19
+ "existingScript",
20
+ {
21
+ type: "text",
22
+ question:
23
+ "Please specify the name of the existing worker in this account?",
24
+ label: "worker",
25
+ defaultValue: ctx.project.name,
26
+ }
27
+ );
28
+ }
29
+
30
+ // `wrangler init --from-dash` bails if you opt-out of creating a package.json
31
+ // so run it (with -y) in a tempdir and copy the src files after
32
+ const tempdir = await mkdtemp(join(tmpdir(), "c3-wrangler-init--from-dash-"));
33
+ await runCommand(
34
+ [
35
+ ...dlx,
36
+ "wrangler@3",
37
+ "init",
38
+ "--from-dash",
39
+ ctx.args.existingScript,
40
+ "-y",
41
+ "--no-delegate-c3",
42
+ ],
43
+ {
44
+ silent: true,
45
+ cwd: tempdir, // use a tempdir because we don't want all the files
46
+ env: { CLOUDFLARE_ACCOUNT_ID: ctx.account?.id },
47
+ startText: "Downloading existing worker files",
48
+ doneText: `${brandColor("downloaded")} ${dim(
49
+ `existing "${ctx.args.existingScript}" worker files`
50
+ )}`,
51
+ }
52
+ );
53
+
54
+ // copy src/* files from the downloaded worker
55
+ await cp(
56
+ join(tempdir, ctx.args.existingScript, "src"),
57
+ join(ctx.project.path, "src"),
58
+ { recursive: true }
59
+ );
60
+
61
+ // copy wrangler.toml from the downloaded worker
62
+ await cp(
63
+ join(tempdir, ctx.args.existingScript, "wrangler.toml"),
64
+ join(ctx.project.path, "wrangler.toml")
65
+ );
66
+ }
67
+
68
+ export default {
69
+ configVersion: 1,
70
+ id: "pre-existing",
71
+ displayName: "Pre-existing Worker (from Dashboard)",
72
+ platform: "workers",
73
+ hidden: true,
74
+ copyFiles: {
75
+ path: "./js",
76
+ },
77
+ configure: async (ctx: C3Context) => {
78
+ await copyExistingWorkerFiles(ctx);
79
+
80
+ // Force no-deploy since the worker is already deployed
81
+ ctx.args.deploy = false;
82
+ },
83
+ };
@@ -0,0 +1,13 @@
1
+ # http://editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ indent_style = tab
6
+ tab_width = 2
7
+ end_of_line = lf
8
+ charset = utf-8
9
+ trim_trailing_whitespace = true
10
+ insert_final_newline = true
11
+
12
+ [*.yml]
13
+ indent_style = space
@@ -0,0 +1,6 @@
1
+ {
2
+ "printWidth": 140,
3
+ "singleQuote": true,
4
+ "semi": true,
5
+ "useTabs": true
6
+ }
@@ -169,3 +169,4 @@ dist
169
169
  # wrangler project
170
170
 
171
171
  .dev.vars
172
+ .wrangler/
@@ -1,15 +1,12 @@
1
1
  {
2
- "name": "cloudflare-workers-chatgpt-plugin-example",
3
- "version": "0.0.1",
2
+ "name": "<TBD>",
3
+ "version": "0.0.0",
4
4
  "private": true,
5
5
  "scripts": {
6
6
  "deploy": "wrangler deploy",
7
7
  "dev": "wrangler dev",
8
8
  "start": "wrangler dev"
9
9
  },
10
- "dependencies": {
11
- "@cloudflare/itty-router-openapi": "^1.0.1"
12
- },
13
10
  "devDependencies": {
14
11
  "wrangler": "^3.0.0"
15
12
  }
@@ -0,0 +1,3 @@
1
+ name = "<TBD>"
2
+ main = "src/index.js"
3
+ compatibility_date = "<TBD>"
@@ -0,0 +1,26 @@
1
+ export default {
2
+ configVersion: 1,
3
+ id: "queues",
4
+ displayName: "Queue consumer & producer Worker",
5
+ platform: "workers",
6
+ copyFiles: {
7
+ variants: {
8
+ js: {
9
+ path: "./js",
10
+ },
11
+ ts: {
12
+ path: "./ts",
13
+ },
14
+ },
15
+ },
16
+ bindings: {
17
+ queues: [
18
+ {
19
+ boundVariable: "MY_QUEUE",
20
+ defaultValue: "my-queue",
21
+ producer: true,
22
+ consumer: true,
23
+ },
24
+ ],
25
+ },
26
+ };
@@ -0,0 +1,146 @@
1
+ import { crash, endSection } from "@cloudflare/cli";
2
+ import { brandColor } from "@cloudflare/cli/colors";
3
+ import { spinner } from "@cloudflare/cli/interactive";
4
+ import { loadTemplateSnippets, transformFile } from "helpers/codemod";
5
+ import { runCommand, runFrameworkGenerator } from "helpers/command";
6
+ import { usesTypescript } from "helpers/files";
7
+ import { detectPackageManager } from "helpers/packages";
8
+ import * as recast from "recast";
9
+ import { quoteShellArgs } from "../../src/common";
10
+ import type { TemplateConfig } from "../../src/templates";
11
+ import type { C3Context } from "types";
12
+
13
+ const { npm, npx } = detectPackageManager();
14
+
15
+ const generate = async (ctx: C3Context) => {
16
+ await runFrameworkGenerator(ctx, ["basic", ctx.project.name]);
17
+ };
18
+
19
+ const configure = async (ctx: C3Context) => {
20
+ // Add the pages integration
21
+ const cmd = [npx, "qwik", "add", "cloudflare-pages"];
22
+ endSection(`Running ${quoteShellArgs(cmd)}`);
23
+ await runCommand(cmd);
24
+
25
+ addBindingsProxy(ctx);
26
+ populateCloudflareEnv();
27
+ };
28
+
29
+ const addBindingsProxy = (ctx: C3Context) => {
30
+ // Qwik only has a typescript template atm.
31
+ // This check is an extra precaution
32
+ if (!usesTypescript(ctx)) {
33
+ return;
34
+ }
35
+
36
+ const s = spinner();
37
+ s.start("Updating `vite.config.ts`");
38
+
39
+ const snippets = loadTemplateSnippets(ctx);
40
+ const b = recast.types.builders;
41
+
42
+ transformFile("vite.config.ts", {
43
+ // Insert the env declaration after the last import (but before the rest of the body)
44
+ visitProgram: function (n) {
45
+ const lastImportIndex = n.node.body.findLastIndex(
46
+ (t) => t.type === "ImportDeclaration"
47
+ );
48
+ const lastImport = n.get("body", lastImportIndex);
49
+ lastImport.insertAfter(...snippets.getPlatformProxyTs);
50
+
51
+ return this.traverse(n);
52
+ },
53
+ // Pass the `platform` object from the declaration to the `qwikCity` plugin
54
+ visitCallExpression: function (n) {
55
+ const callee = n.node.callee as recast.types.namedTypes.Identifier;
56
+ if (callee.name !== "qwikCity") {
57
+ return this.traverse(n);
58
+ }
59
+
60
+ // The config object passed to `qwikCity`
61
+ const configArgument = n.node.arguments[0] as
62
+ | recast.types.namedTypes.ObjectExpression
63
+ | undefined;
64
+
65
+ const platformPropery = b.objectProperty.from({
66
+ key: b.identifier("platform"),
67
+ value: b.identifier("platform"),
68
+ shorthand: true,
69
+ });
70
+
71
+ if (!configArgument) {
72
+ n.node.arguments = [b.objectExpression([platformPropery])];
73
+
74
+ return false;
75
+ }
76
+
77
+ if (configArgument.type !== "ObjectExpression") {
78
+ crash("Failed to update `vite.config.ts`");
79
+ }
80
+
81
+ // Add the `platform` object to the object
82
+ configArgument.properties.push(platformPropery);
83
+
84
+ return false;
85
+ },
86
+ });
87
+
88
+ s.stop(`${brandColor("updated")} \`vite.config.ts\``);
89
+ };
90
+
91
+ const populateCloudflareEnv = () => {
92
+ const entrypointPath = "src/entry.cloudflare-pages.tsx";
93
+
94
+ const s = spinner();
95
+ s.start(`Updating \`${entrypointPath}\``);
96
+
97
+ transformFile(entrypointPath, {
98
+ visitTSInterfaceDeclaration: function (n) {
99
+ const b = recast.types.builders;
100
+ const id = n.node.id as recast.types.namedTypes.Identifier;
101
+ if (id.name !== "QwikCityPlatform") {
102
+ this.traverse(n);
103
+ }
104
+
105
+ const newBody = [
106
+ ["env", "Env"],
107
+ // Qwik doesn't supply `cf` to the platform object. Should they do so, uncomment this
108
+ // ["cf", "CfProperties"],
109
+ ].map(([varName, type]) =>
110
+ b.tsPropertySignature(
111
+ b.identifier(varName),
112
+ b.tsTypeAnnotation(b.tsTypeReference(b.identifier(type)))
113
+ )
114
+ );
115
+
116
+ n.node.body.body = newBody;
117
+
118
+ return false;
119
+ },
120
+ });
121
+
122
+ s.stop(`${brandColor("updated")} \`${entrypointPath}\``);
123
+ };
124
+
125
+ const config: TemplateConfig = {
126
+ configVersion: 1,
127
+ id: "qwik",
128
+ displayName: "Qwik",
129
+ platform: "pages",
130
+ copyFiles: {
131
+ path: "./templates",
132
+ },
133
+ generate,
134
+ configure,
135
+ transformPackageJson: async () => ({
136
+ scripts: {
137
+ deploy: `${npm} run build && wrangler pages deploy ./dist`,
138
+ preview: `${npm} run build && wrangler pages dev ./dist`,
139
+ "build-cf-types": `wrangler types`,
140
+ },
141
+ }),
142
+ devScript: "dev",
143
+ deployScript: "deploy",
144
+ previewScript: "preview",
145
+ };
146
+ export default config;
@@ -0,0 +1,6 @@
1
+ let platform = {};
2
+
3
+ if(process.env.NODE_ENV === 'development') {
4
+ const { getPlatformProxy } = await import('wrangler');
5
+ platform = await getPlatformProxy();
6
+ }
@@ -0,0 +1,3 @@
1
+ // Generated by Wrangler on Fri Feb 16 2024 15:52:18 GMT-0600 (Central Standard Time)
2
+ // After adding bindings to `wrangler.toml`, regenerate this interface via `npm build-cf-types`
3
+ interface Env {}
@@ -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"]
@@ -0,0 +1,31 @@
1
+ import { logRaw } from "@cloudflare/cli";
2
+ import { runFrameworkGenerator } from "helpers/command";
3
+ import { detectPackageManager } from "helpers/packages";
4
+ import type { TemplateConfig } from "../../src/templates";
5
+ import type { C3Context } from "types";
6
+
7
+ const { npm } = detectPackageManager();
8
+
9
+ const generate = async (ctx: C3Context) => {
10
+ await runFrameworkGenerator(ctx, [ctx.project.name]);
11
+
12
+ logRaw("");
13
+ };
14
+
15
+ const config: TemplateConfig = {
16
+ configVersion: 1,
17
+ id: "react",
18
+ displayName: "React",
19
+ platform: "pages",
20
+ generate,
21
+ transformPackageJson: async () => ({
22
+ scripts: {
23
+ deploy: `${npm} run build && wrangler pages deploy ./build`,
24
+ preview: `${npm} run build && wrangler pages dev ./build`,
25
+ },
26
+ }),
27
+ devScript: "dev",
28
+ deployScript: "deploy",
29
+ previewScript: "preview",
30
+ };
31
+ export default config;
@@ -0,0 +1,66 @@
1
+ import { logRaw } from "@cloudflare/cli";
2
+ import { brandColor, dim } from "@cloudflare/cli/colors";
3
+ import { spinner } from "@cloudflare/cli/interactive";
4
+ import { transformFile } from "helpers/codemod";
5
+ import { runFrameworkGenerator } from "helpers/command.js";
6
+ import { detectPackageManager } from "helpers/packages";
7
+ import type { TemplateConfig } from "../../src/templates";
8
+ import type { C3Context } from "types";
9
+
10
+ const { npm } = detectPackageManager();
11
+
12
+ const generate = async (ctx: C3Context) => {
13
+ await runFrameworkGenerator(ctx, [
14
+ ctx.project.name,
15
+ "--template",
16
+ "https://github.com/remix-run/remix/tree/main/templates/vite-cloudflare",
17
+ ]);
18
+
19
+ logRaw(""); // newline
20
+ };
21
+
22
+ const configure = async () => {
23
+ const typeDefsPath = "load-context.ts";
24
+
25
+ const s = spinner();
26
+ s.start(`Updating \`${typeDefsPath}\``);
27
+
28
+ // Remove the empty Env declaration from the template to allow the type from
29
+ // worker-configuration.d.ts to take over
30
+ transformFile(typeDefsPath, {
31
+ visitTSInterfaceDeclaration(n) {
32
+ if (n.node.id.type === "Identifier" && n.node.id.name !== "Env") {
33
+ return this.traverse(n);
34
+ }
35
+
36
+ // Removes the node
37
+ n.replace();
38
+ return false;
39
+ },
40
+ });
41
+
42
+ s.stop(`${brandColor("updated")} \`${dim(typeDefsPath)}\``);
43
+ };
44
+
45
+ const config: TemplateConfig = {
46
+ configVersion: 1,
47
+ id: "remix",
48
+ platform: "pages",
49
+ displayName: "Remix",
50
+ copyFiles: {
51
+ path: "./templates",
52
+ },
53
+ generate,
54
+ configure,
55
+ transformPackageJson: async () => ({
56
+ scripts: {
57
+ deploy: `${npm} run build && wrangler pages deploy ./build/client`,
58
+ preview: `${npm} run build && wrangler pages dev ./build/client`,
59
+ "build-cf-types": `wrangler types`,
60
+ },
61
+ }),
62
+ devScript: "dev",
63
+ deployScript: "deploy",
64
+ previewScript: "preview",
65
+ };
66
+ export default config;
@@ -0,0 +1,3 @@
1
+ // Generated by Wrangler on Fri Feb 16 2024 15:52:18 GMT-0600 (Central Standard Time)
2
+ // After adding bindings to `wrangler.toml`, regenerate this interface via `npm build-cf-types`
3
+ interface Env {}
@@ -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"]
@@ -0,0 +1,16 @@
1
+ export default {
2
+ configVersion: 1,
3
+ id: "scheduled",
4
+ displayName: "Scheduled Worker (Cron Trigger)",
5
+ platform: "workers",
6
+ copyFiles: {
7
+ variants: {
8
+ js: {
9
+ path: "./js",
10
+ },
11
+ ts: {
12
+ path: "./ts",
13
+ },
14
+ },
15
+ },
16
+ };
@@ -0,0 +1,81 @@
1
+ import { logRaw, updateStatus } from "@cloudflare/cli";
2
+ import { blue } from "@cloudflare/cli/colors";
3
+ import { transformFile } from "helpers/codemod";
4
+ import { runFrameworkGenerator } from "helpers/command";
5
+ import { compatDateFlag, usesTypescript } from "helpers/files";
6
+ import { detectPackageManager } from "helpers/packages";
7
+ import * as recast from "recast";
8
+ import type { TemplateConfig } from "../../src/templates";
9
+ import type { C3Context } from "types";
10
+
11
+ const { npm } = detectPackageManager();
12
+
13
+ const generate = async (ctx: C3Context) => {
14
+ // Run the create-solid command
15
+ // -s flag forces solid-start
16
+ await runFrameworkGenerator(ctx, ["-p", ctx.project.name, "-s"]);
17
+
18
+ logRaw("");
19
+ };
20
+
21
+ const configure = async (ctx: C3Context) => {
22
+ usesTypescript(ctx);
23
+ const filePath = `app.config.${usesTypescript(ctx) ? "ts" : "js"}`;
24
+
25
+ updateStatus(`Updating configuration in ${blue(filePath)}`);
26
+
27
+ transformFile(filePath, {
28
+ visitCallExpression: function (n) {
29
+ const callee = n.node.callee as recast.types.namedTypes.Identifier;
30
+ if (callee.name !== "defineConfig") {
31
+ return this.traverse(n);
32
+ }
33
+
34
+ const b = recast.types.builders;
35
+ n.node.arguments = [
36
+ b.objectExpression([
37
+ b.objectProperty(
38
+ b.identifier("server"),
39
+ b.objectExpression([
40
+ b.objectProperty(
41
+ b.identifier("preset"),
42
+ b.stringLiteral("cloudflare-pages")
43
+ ),
44
+ b.objectProperty(
45
+ b.identifier("rollupConfig"),
46
+ b.objectExpression([
47
+ b.objectProperty(
48
+ b.identifier("external"),
49
+ b.arrayExpression([b.stringLiteral("node:async_hooks")])
50
+ ),
51
+ ])
52
+ ),
53
+ ])
54
+ ),
55
+ ]),
56
+ ];
57
+
58
+ return false;
59
+ },
60
+ });
61
+ };
62
+
63
+ const config: TemplateConfig = {
64
+ configVersion: 1,
65
+ id: "solid",
66
+ displayName: "Solid",
67
+ platform: "pages",
68
+ generate,
69
+ configure,
70
+ transformPackageJson: async () => ({
71
+ scripts: {
72
+ preview: `${npm} run build && npx wrangler pages dev dist ${await compatDateFlag()} --compatibility-flag nodejs_compat`,
73
+ deploy: `${npm} run build && wrangler pages deploy ./dist`,
74
+ },
75
+ }),
76
+ compatibilityFlags: ["nodejs_compat"],
77
+ devScript: "dev",
78
+ deployScript: "deploy",
79
+ previewScript: "preview",
80
+ };
81
+ export default config;