create-cloudflare 0.0.0-d1bcaaf2 → 0.0.0-d1d5b5313

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 (259) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +58324 -56468
  3. package/dist/tsconfig.tsbuildinfo +1 -0
  4. package/package.json +38 -27
  5. package/templates/analog/c3.ts +135 -0
  6. package/templates/analog/snippets/devBindingsModule.ts +7 -0
  7. package/templates/analog/templates/env.d.ts +13 -0
  8. package/templates/analog/templates/src/dev-bindings.ts +18 -0
  9. package/templates/analog/templates/worker-configuration.d.ts +4 -0
  10. package/templates/analog/templates/wrangler.jsonc +5 -0
  11. package/templates/angular/c3.ts +60 -26
  12. package/templates/angular/templates/src/server.ts +15 -0
  13. package/templates/angular/templates/tools/copy-files.mjs +8 -2
  14. package/templates/astro/c3.ts +66 -19
  15. package/templates/astro/templates/js/wrangler.jsonc +8 -0
  16. package/templates/astro/templates/ts/src/env.d.ts +5 -0
  17. package/templates/astro/templates/ts/worker-configuration.d.ts +4 -0
  18. package/templates/astro/templates/ts/wrangler.jsonc +8 -0
  19. package/templates/common/c3.ts +3 -0
  20. package/templates/common/js/.editorconfig +0 -1
  21. package/templates/common/js/package.json +1 -1
  22. package/templates/common/js/wrangler.jsonc +8 -0
  23. package/templates/common/ts/.editorconfig +0 -1
  24. package/templates/common/ts/package.json +4 -3
  25. package/templates/common/ts/src/ab-test.ts +2 -2
  26. package/templates/common/ts/src/index.ts +5 -2
  27. package/templates/common/ts/src/proxy.ts +2 -2
  28. package/templates/common/ts/src/redirect.ts +2 -2
  29. package/templates/common/ts/tsconfig.json +37 -95
  30. package/templates/common/ts/worker-configuration.d.ts +2 -14
  31. package/templates/common/ts/wrangler.jsonc +8 -0
  32. package/templates/docusaurus/c3.ts +5 -23
  33. package/templates/docusaurus/pages/c3.ts +30 -0
  34. package/templates/docusaurus/workers/c3.ts +33 -0
  35. package/templates/docusaurus/workers/templates/wrangler.jsonc +10 -0
  36. package/templates/gatsby/c3.ts +8 -5
  37. package/templates/hello-world/c3.ts +22 -2
  38. package/templates/hello-world/js/.editorconfig +0 -1
  39. package/templates/hello-world/js/package.json +5 -2
  40. package/templates/hello-world/js/test/index.spec.js +20 -0
  41. package/templates/hello-world/js/vitest.config.js +11 -0
  42. package/templates/hello-world/js/wrangler.jsonc +8 -0
  43. package/templates/hello-world/py/.python-version +1 -0
  44. package/templates/hello-world/py/README.md +23 -0
  45. package/templates/hello-world/py/__dot__gitignore +68 -0
  46. package/templates/hello-world/py/package.json +13 -0
  47. package/templates/hello-world/py/pyproject.toml +9 -0
  48. package/templates/hello-world/py/src/entry.py +4 -0
  49. package/templates/hello-world/py/uv.lock +22 -0
  50. package/templates/hello-world/py/wrangler.jsonc +9 -0
  51. package/templates/hello-world/ts/.editorconfig +0 -1
  52. package/templates/hello-world/ts/package.json +7 -3
  53. package/templates/hello-world/ts/src/index.ts +5 -19
  54. package/templates/hello-world/ts/test/index.spec.ts +25 -0
  55. package/templates/hello-world/ts/test/tsconfig.json +8 -0
  56. package/templates/hello-world/ts/tsconfig.json +39 -96
  57. package/templates/hello-world/ts/vitest.config.mts +11 -0
  58. package/templates/hello-world/ts/worker-configuration.d.ts +4 -0
  59. package/templates/hello-world/ts/wrangler.jsonc +8 -0
  60. package/templates/hello-world-durable-object/c3.ts +3 -1
  61. package/templates/hello-world-durable-object/js/.editorconfig +0 -1
  62. package/templates/hello-world-durable-object/js/package.json +1 -1
  63. package/templates/hello-world-durable-object/js/src/index.js +21 -17
  64. package/templates/hello-world-durable-object/js/wrangler.jsonc +24 -0
  65. package/templates/hello-world-durable-object/ts/.editorconfig +0 -1
  66. package/templates/hello-world-durable-object/ts/package.json +4 -4
  67. package/templates/hello-world-durable-object/ts/src/index.ts +26 -39
  68. package/templates/hello-world-durable-object/ts/tsconfig.json +36 -95
  69. package/templates/hello-world-durable-object/ts/worker-configuration.d.ts +5 -0
  70. package/templates/hello-world-durable-object/ts/wrangler.jsonc +24 -0
  71. package/templates/hono/c3.ts +46 -1
  72. package/templates/hono/snippets/appDeclaration.ts +1 -0
  73. package/templates/hono/templates/worker-configuration.d.ts +4 -0
  74. package/templates/hono/templates/wrangler.jsonc +8 -0
  75. package/templates/next/README.md +15 -6
  76. package/templates/next/app/js/app/api/hello/route.js +5 -5
  77. package/templates/next/app/ts/app/api/hello/route.ts +5 -6
  78. package/templates/next/c3.ts +42 -45
  79. package/templates/next/env.d.ts +3 -5
  80. package/templates/next/pages/js/pages/api/hello.js +1 -1
  81. package/templates/next/pages/ts/pages/api/hello.ts +1 -1
  82. package/templates/next/wrangler.jsonc +8 -0
  83. package/templates/nuxt/c3.ts +56 -21
  84. package/templates/nuxt/templates/env.d.ts +14 -0
  85. package/templates/nuxt/templates/worker-configuration.d.ts +4 -0
  86. package/templates/nuxt/templates/wrangler.jsonc +8 -0
  87. package/templates/openapi/c3.ts +1 -0
  88. package/templates/openapi/ts/README.md +3 -3
  89. package/templates/openapi/ts/package.json +7 -4
  90. package/templates/openapi/ts/src/endpoints/taskCreate.ts +26 -16
  91. package/templates/openapi/ts/src/endpoints/taskDelete.ts +20 -19
  92. package/templates/openapi/ts/src/endpoints/taskFetch.ts +30 -23
  93. package/templates/openapi/ts/src/endpoints/taskList.ts +27 -24
  94. package/templates/openapi/ts/src/index.ts +14 -20
  95. package/templates/openapi/ts/src/types.ts +9 -8
  96. package/templates/openapi/ts/worker-configuration.d.ts +4 -0
  97. package/templates/openapi/ts/wrangler.jsonc +8 -0
  98. package/templates/pre-existing/c3.ts +37 -18
  99. package/templates/pre-existing/js/.editorconfig +0 -1
  100. package/templates/pre-existing/js/package.json +1 -1
  101. package/templates/queues/c3.ts +2 -0
  102. package/templates/queues/js/.editorconfig +0 -1
  103. package/templates/queues/js/package.json +1 -1
  104. package/templates/queues/js/wrangler.jsonc +21 -0
  105. package/templates/queues/ts/.editorconfig +0 -1
  106. package/templates/queues/ts/package.json +4 -3
  107. package/templates/queues/ts/src/index.ts +6 -8
  108. package/templates/queues/ts/tsconfig.json +36 -95
  109. package/templates/queues/ts/worker-configuration.d.ts +5 -0
  110. package/templates/queues/ts/wrangler.jsonc +21 -0
  111. package/templates/qwik/c3.ts +85 -32
  112. package/templates/qwik/snippets/getPlatformProxy.ts +6 -0
  113. package/templates/qwik/templates/worker-configuration.d.ts +4 -0
  114. package/templates/qwik/templates/wrangler.jsonc +8 -0
  115. package/templates/react/c3.ts +38 -6
  116. package/templates/remix/c3.ts +40 -6
  117. package/templates/remix/templates/worker-configuration.d.ts +4 -0
  118. package/templates/remix/templates/wrangler.jsonc +5 -0
  119. package/templates/scheduled/c3.ts +2 -0
  120. package/templates/scheduled/js/.editorconfig +0 -1
  121. package/templates/scheduled/js/package.json +3 -3
  122. package/templates/scheduled/js/src/index.js +9 -2
  123. package/templates/scheduled/js/wrangler.jsonc +13 -0
  124. package/templates/scheduled/ts/.editorconfig +0 -1
  125. package/templates/scheduled/ts/package.json +5 -4
  126. package/templates/scheduled/ts/src/index.ts +8 -25
  127. package/templates/scheduled/ts/tsconfig.json +36 -95
  128. package/templates/scheduled/ts/worker-configuration.d.ts +4 -0
  129. package/templates/scheduled/ts/wrangler.jsonc +13 -0
  130. package/templates/solid/c3.ts +62 -14
  131. package/templates/solid/templates/wrangler.jsonc +8 -0
  132. package/templates/svelte/c3.ts +46 -17
  133. package/templates/svelte/templates/wrangler.jsonc +5 -0
  134. package/templates/vue/c3.ts +8 -6
  135. package/templates-experimental/angular/c3.ts +130 -0
  136. package/templates-experimental/angular/templates/src/server.ts +15 -0
  137. package/templates-experimental/angular/templates/wrangler.jsonc +12 -0
  138. package/templates-experimental/astro/c3.ts +98 -0
  139. package/templates-experimental/astro/templates/js/public/.assetsignore +4 -0
  140. package/templates-experimental/astro/templates/js/wrangler.jsonc +15 -0
  141. package/templates-experimental/astro/templates/ts/public/.assetsignore +4 -0
  142. package/templates-experimental/astro/templates/ts/src/env.d.ts +5 -0
  143. package/templates-experimental/astro/templates/ts/worker-configuration.d.ts +4 -0
  144. package/templates-experimental/astro/templates/ts/wrangler.jsonc +15 -0
  145. package/templates-experimental/gatsby/c3.ts +53 -0
  146. package/templates-experimental/gatsby/templates/wrangler.jsonc +10 -0
  147. package/templates-experimental/hello-world-assets-only/c3.ts +15 -0
  148. package/templates-experimental/hello-world-assets-only/templates/package.json +13 -0
  149. package/templates-experimental/hello-world-assets-only/templates/public/index.html +11 -0
  150. package/templates-experimental/hello-world-assets-only/templates/wrangler.jsonc +10 -0
  151. package/templates-experimental/hello-world-durable-object-with-assets/c3.ts +23 -0
  152. package/templates-experimental/hello-world-durable-object-with-assets/js/.editorconfig +12 -0
  153. package/templates-experimental/hello-world-durable-object-with-assets/js/.prettierrc +6 -0
  154. package/templates-experimental/hello-world-durable-object-with-assets/js/__dot__gitignore +172 -0
  155. package/templates-experimental/hello-world-durable-object-with-assets/js/package.json +13 -0
  156. package/templates-experimental/hello-world-durable-object-with-assets/js/public/index.html +19 -0
  157. package/templates-experimental/hello-world-durable-object-with-assets/js/src/index.js +69 -0
  158. package/templates-experimental/hello-world-durable-object-with-assets/js/wrangler.jsonc +28 -0
  159. package/templates-experimental/hello-world-durable-object-with-assets/ts/.editorconfig +12 -0
  160. package/templates-experimental/hello-world-durable-object-with-assets/ts/.prettierrc +6 -0
  161. package/templates-experimental/hello-world-durable-object-with-assets/ts/__dot__gitignore +172 -0
  162. package/templates-experimental/hello-world-durable-object-with-assets/ts/package.json +15 -0
  163. package/templates-experimental/hello-world-durable-object-with-assets/ts/public/index.html +19 -0
  164. package/templates-experimental/hello-world-durable-object-with-assets/ts/src/index.ts +66 -0
  165. package/templates-experimental/hello-world-durable-object-with-assets/ts/tsconfig.json +42 -0
  166. package/templates-experimental/hello-world-durable-object-with-assets/ts/worker-configuration.d.ts +5 -0
  167. package/templates-experimental/hello-world-durable-object-with-assets/ts/wrangler.jsonc +28 -0
  168. package/templates-experimental/hello-world-with-assets/c3.ts +22 -0
  169. package/templates-experimental/hello-world-with-assets/js/.editorconfig +12 -0
  170. package/templates-experimental/hello-world-with-assets/js/.prettierrc +6 -0
  171. package/templates-experimental/hello-world-with-assets/js/__dot__gitignore +172 -0
  172. package/templates-experimental/hello-world-with-assets/js/package.json +16 -0
  173. package/templates-experimental/hello-world-with-assets/js/public/index.html +31 -0
  174. package/templates-experimental/hello-world-with-assets/js/src/index.js +23 -0
  175. package/templates-experimental/hello-world-with-assets/js/test/index.spec.js +41 -0
  176. package/templates-experimental/hello-world-with-assets/js/vitest.config.js +11 -0
  177. package/templates-experimental/hello-world-with-assets/js/wrangler.jsonc +15 -0
  178. package/templates-experimental/hello-world-with-assets/py/__dot__gitignore +68 -0
  179. package/templates-experimental/hello-world-with-assets/py/package.json +13 -0
  180. package/templates-experimental/hello-world-with-assets/py/public/index.html +31 -0
  181. package/templates-experimental/hello-world-with-assets/py/src/entry.py +9 -0
  182. package/templates-experimental/hello-world-with-assets/py/wrangler.jsonc +15 -0
  183. package/templates-experimental/hello-world-with-assets/ts/.editorconfig +12 -0
  184. package/templates-experimental/hello-world-with-assets/ts/.prettierrc +6 -0
  185. package/templates-experimental/hello-world-with-assets/ts/__dot__gitignore +172 -0
  186. package/templates-experimental/hello-world-with-assets/ts/package.json +18 -0
  187. package/templates-experimental/hello-world-with-assets/ts/public/index.html +31 -0
  188. package/templates-experimental/hello-world-with-assets/ts/src/index.ts +26 -0
  189. package/templates-experimental/hello-world-with-assets/ts/test/index.spec.ts +41 -0
  190. package/templates-experimental/hello-world-with-assets/ts/test/tsconfig.json +8 -0
  191. package/templates-experimental/hello-world-with-assets/ts/tsconfig.json +44 -0
  192. package/templates-experimental/hello-world-with-assets/ts/vitest.config.mts +11 -0
  193. package/templates-experimental/hello-world-with-assets/ts/worker-configuration.d.ts +4 -0
  194. package/templates-experimental/hello-world-with-assets/ts/wrangler.jsonc +15 -0
  195. package/templates-experimental/hono/c3.ts +44 -0
  196. package/templates-experimental/hono/templates/public/index.html +19 -0
  197. package/templates-experimental/hono/templates/src/index.ts +9 -0
  198. package/templates-experimental/hono/templates/worker-configuration.d.ts +4 -0
  199. package/templates-experimental/hono/templates/wrangler.jsonc +9 -0
  200. package/templates-experimental/next/c3.ts +75 -0
  201. package/templates-experimental/next/templates/.dev.vars +2 -0
  202. package/templates-experimental/next/templates/__dot__gitignore +39 -0
  203. package/templates-experimental/next/templates/cloudflare-env.d.ts +5 -0
  204. package/templates-experimental/next/templates/open-next.config.ts +28 -0
  205. package/templates-experimental/next/templates/wrangler.jsonc +13 -0
  206. package/templates-experimental/nuxt/c3.ts +135 -0
  207. package/templates-experimental/nuxt/templates/env.d.ts +14 -0
  208. package/templates-experimental/nuxt/templates/worker-configuration.d.ts +4 -0
  209. package/templates-experimental/nuxt/templates/wrangler.jsonc +12 -0
  210. package/templates-experimental/qwik/c3.ts +154 -0
  211. package/templates-experimental/qwik/snippets/getPlatformProxy.ts +6 -0
  212. package/templates-experimental/qwik/templates/public/.assetsignore +4 -0
  213. package/templates-experimental/qwik/templates/worker-configuration.d.ts +4 -0
  214. package/templates-experimental/qwik/templates/wrangler.jsonc +15 -0
  215. package/templates-experimental/react/c3.ts +182 -0
  216. package/templates-experimental/react/js/api/index.js +13 -0
  217. package/templates-experimental/react/js/src/App.jsx +58 -0
  218. package/templates-experimental/react/js/src/assets/Cloudflare_Logo.svg +26 -0
  219. package/templates-experimental/react/js/wrangler.json +9 -0
  220. package/templates-experimental/react/ts/api/index.ts +17 -0
  221. package/templates-experimental/react/ts/src/App.tsx +58 -0
  222. package/templates-experimental/react/ts/src/assets/Cloudflare_Logo.svg +26 -0
  223. package/templates-experimental/react/ts/tsconfig.worker.json +8 -0
  224. package/templates-experimental/react/ts/wrangler.json +9 -0
  225. package/templates-experimental/remix/c3.ts +52 -0
  226. package/templates-experimental/remix/templates/public/.assetsignore +0 -0
  227. package/templates-experimental/remix/templates/worker-configuration.d.ts +4 -0
  228. package/templates-experimental/remix/templates/wrangler.toml +11 -0
  229. package/templates-experimental/solid/c3.ts +94 -0
  230. package/templates-experimental/solid/templates/wrangler.jsonc +15 -0
  231. package/templates-experimental/svelte/c3.ts +129 -0
  232. package/templates-experimental/svelte/templates/static/.assetsignore +4 -0
  233. package/templates-experimental/svelte/templates/wrangler.jsonc +12 -0
  234. package/templates-experimental/vue/c3.ts +33 -0
  235. package/templates-experimental/vue/templates/wrangler.jsonc +10 -0
  236. package/templates/angular/templates/server.ts +0 -34
  237. package/templates/angular/templates/tools/alter-polyfills.mjs +0 -27
  238. package/templates/angular/templates/tools/paths.mjs +0 -9
  239. package/templates/common/js/wrangler.toml +0 -51
  240. package/templates/common/ts/wrangler.toml +0 -51
  241. package/templates/hello-world/js/wrangler.toml +0 -51
  242. package/templates/hello-world/ts/wrangler.toml +0 -51
  243. package/templates/hello-world-durable-object/js/wrangler.toml +0 -51
  244. package/templates/hello-world-durable-object/ts/wrangler.toml +0 -51
  245. package/templates/next/wrangler.toml +0 -57
  246. package/templates/nuxt/templates/wrangler.toml +0 -50
  247. package/templates/openapi/ts/wrangler.toml +0 -3
  248. package/templates/pre-existing/js/wrangler.toml +0 -3
  249. package/templates/queues/js/wrangler.toml +0 -19
  250. package/templates/queues/ts/wrangler.toml +0 -19
  251. package/templates/qwik/templates/wrangler.toml +0 -50
  252. package/templates/scheduled/js/wrangler.toml +0 -9
  253. package/templates/scheduled/ts/wrangler.toml +0 -9
  254. package/templates/solid/js/vite.config.js +0 -12
  255. package/templates/solid/ts/vite.config.ts +0 -12
  256. package/templates/svelte/js/src/hooks.server.js +0 -25
  257. package/templates/svelte/js/wrangler.toml +0 -50
  258. package/templates/svelte/ts/src/hooks.server.ts +0 -24
  259. package/templates/svelte/ts/wrangler.toml +0 -50
@@ -1,25 +1,70 @@
1
1
  import { logRaw } from "@cloudflare/cli";
2
- import { runFrameworkGenerator } from "helpers/command";
2
+ import { brandColor, dim } from "@cloudflare/cli/colors";
3
+ import { spinner } from "@cloudflare/cli/interactive";
4
+ import { runFrameworkGenerator } from "frameworks/index";
5
+ import { loadTemplateSnippets, transformFile } from "helpers/codemod";
6
+ import { detectPackageManager } from "helpers/packageManagers";
3
7
  import type { TemplateConfig } from "../../src/templates";
8
+ import type * as recast from "recast";
4
9
  import type { C3Context } from "types";
5
10
 
6
11
  const generate = async (ctx: C3Context) => {
12
+ const { name: pm } = detectPackageManager();
13
+
7
14
  await runFrameworkGenerator(ctx, [
8
15
  ctx.project.name,
9
16
  "--template",
10
17
  "cloudflare-workers",
18
+ "--install",
19
+ "--pm",
20
+ pm,
11
21
  ]);
12
22
 
13
23
  logRaw(""); // newline
14
24
  };
15
25
 
26
+ const configure = async (ctx: C3Context) => {
27
+ const indexFile = "src/index.ts";
28
+
29
+ const s = spinner();
30
+ s.start(`Updating \`${indexFile}\``);
31
+
32
+ const snippets = loadTemplateSnippets(ctx);
33
+
34
+ transformFile(indexFile, {
35
+ visitVariableDeclarator(n) {
36
+ if (n.node.id.type === "Identifier" && n.node.id.name === "app") {
37
+ n.node.init = snippets
38
+ .appDeclarationTs[0] as recast.types.namedTypes.NewExpression;
39
+
40
+ return false;
41
+ }
42
+ },
43
+ });
44
+
45
+ s.stop(`${brandColor("updated")} \`${dim(indexFile)}\``);
46
+ };
47
+
16
48
  const config: TemplateConfig = {
17
49
  configVersion: 1,
18
50
  id: "hono",
51
+ frameworkCli: "create-hono",
19
52
  displayName: "Hono",
53
+ copyFiles: {
54
+ path: "./templates",
55
+ },
20
56
  platform: "workers",
21
57
  generate,
58
+ configure,
59
+ transformPackageJson: async () => ({
60
+ scripts: {
61
+ dev: "wrangler dev",
62
+ deploy: "wrangler deploy --minify",
63
+ "cf-typegen": "wrangler types --env-interface CloudflareBindings",
64
+ },
65
+ }),
22
66
  devScript: "dev",
23
67
  deployScript: "deploy",
68
+ previewScript: "dev",
24
69
  };
25
70
  export default config;
@@ -0,0 +1 @@
1
+ new Hono<{ Bindings: CloudflareBindings }>()
@@ -0,0 +1,4 @@
1
+ // Generated by Wrangler
2
+ // After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen`
3
+ interface CloudflareBindings {
4
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "<TBD>",
3
+ "main": "src/index.ts",
4
+ "compatibility_date": "<TBD>",
5
+ "observability": {
6
+ "enabled": true
7
+ }
8
+ }
@@ -23,7 +23,7 @@ Besides the `dev` script mentioned above `c3` has added a few extra scripts that
23
23
  - `preview` to locally preview your Pages application using the [Wrangler](https://developers.cloudflare.com/workers/wrangler/) CLI
24
24
  - `deploy` to deploy your Pages application using the [Wrangler](https://developers.cloudflare.com/workers/wrangler/) CLI
25
25
 
26
- > __Note:__ while the `dev` script is optimal for local development you should preview your Pages application as well (periodically or before deployments) in order to make sure that it can properly work in the Pages environment (for more details see the [`@cloudflare/next-on-pages` recommended workflow](https://github.com/cloudflare/next-on-pages/blob/05b6256/internal-packages/next-dev/README.md#recommended-workflow))
26
+ > __Note:__ while the `dev` script is optimal for local development you should preview your Pages application as well (periodically or before deployments) in order to make sure that it can properly work in the Pages environment (for more details see the [`@cloudflare/next-on-pages` recommended workflow](https://github.com/cloudflare/next-on-pages/blob/main/internal-packages/next-dev/README.md#recommended-development-workflow))
27
27
 
28
28
  ### Bindings
29
29
 
@@ -46,13 +46,22 @@ In order to enable the example:
46
46
  ```ts
47
47
  // KV Example:
48
48
  ```
49
- and uncomment the commented lines below it.
50
- - Do the same in the `wrangler.toml` file, where
51
- the comment is:
49
+ and uncomment the commented lines below it (also uncomment the relevant imports).
50
+ - In the `wrangler.jsonc` file add the following configuration line:
52
51
  ```
53
- # KV Example:
52
+ "kv_namespaces": [{ "binding": "MY_KV_NAMESPACE", "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }],
53
+ ```
54
+ - If you're using TypeScript run the `cf-typegen` script to update the `env.d.ts` file:
55
+ ```bash
56
+ npm run cf-typegen
57
+ # or
58
+ yarn cf-typegen
59
+ # or
60
+ pnpm cf-typegen
61
+ # or
62
+ bun cf-typegen
54
63
  ```
55
64
 
56
65
  After doing this you can run the `dev` or `preview` script and visit the `/api/hello` route to see the example in action.
57
66
 
58
- Finally, if you also want to see the example work in the deployed application make sure to add a `MY_KV` binding to your Pages application in its [dashboard kv bindings settings section](https://dash.cloudflare.com/?to=/:account/pages/view/:pages-project/settings/functions#kv_namespace_bindings_section). After having configured it make sure to re-deploy your application.
67
+ Finally, if you also want to see the example work in the deployed application make sure to add a `MY_KV_NAMESPACE` binding to your Pages application in its [dashboard kv bindings settings section](https://dash.cloudflare.com/?to=/:account/pages/view/:pages-project/settings/functions#kv_namespace_bindings_section). After having configured it make sure to re-deploy your application.
@@ -1,9 +1,9 @@
1
- import { getRequestContext } from '@cloudflare/next-on-pages'
1
+ // import { getRequestContext } from '@cloudflare/next-on-pages'
2
2
 
3
3
  export const runtime = 'edge'
4
4
 
5
- export async function GET(request) {
6
- let responseText = 'Hello World'
5
+ export async function GET() {
6
+ const responseText = 'Hello World'
7
7
 
8
8
  // In the edge runtime you can use Bindings that are available in your application
9
9
  // (for more details see:
@@ -12,10 +12,10 @@ export async function GET(request) {
12
12
  // )
13
13
  //
14
14
  // KV Example:
15
- // const myKv = getRequestContext().env.MY_KV
15
+ // const myKv = getRequestContext().env.MY_KV_NAMESPACE
16
16
  // await myKv.put('suffix', ' from a KV store!')
17
17
  // const suffix = await myKv.get('suffix')
18
- // responseText += suffix
18
+ // return new Response(responseText + suffix)
19
19
 
20
20
  return new Response(responseText)
21
21
  }
@@ -1,10 +1,9 @@
1
- import type { NextRequest } from 'next/server'
2
- import { getRequestContext } from '@cloudflare/next-on-pages'
1
+ // import { getRequestContext } from '@cloudflare/next-on-pages'
3
2
 
4
3
  export const runtime = 'edge'
5
4
 
6
- export async function GET(request: NextRequest) {
7
- let responseText = 'Hello World'
5
+ export async function GET() {
6
+ const responseText = 'Hello World'
8
7
 
9
8
  // In the edge runtime you can use Bindings that are available in your application
10
9
  // (for more details see:
@@ -13,10 +12,10 @@ export async function GET(request: NextRequest) {
13
12
  // )
14
13
  //
15
14
  // KV Example:
16
- // const myKv = getRequestContext().env.MY_KV
15
+ // const myKv = getRequestContext().env.MY_KV_NAMESPACE
17
16
  // await myKv.put('suffix', ' from a KV store!')
18
17
  // const suffix = await myKv.get('suffix')
19
- // responseText += suffix
18
+ // return new Response(responseText + suffix)
20
19
 
21
20
  return new Response(responseText)
22
21
  }
@@ -1,9 +1,8 @@
1
1
  import { join } from "path";
2
- import { crash, updateStatus, warn } from "@cloudflare/cli";
3
- import { processArgument } from "@cloudflare/cli/args";
2
+ import { updateStatus, warn } from "@cloudflare/cli";
4
3
  import { brandColor, dim } from "@cloudflare/cli/colors";
5
- import { spinner } from "@cloudflare/cli/interactive";
6
- import { installPackages, runFrameworkGenerator } from "helpers/command";
4
+ import { inputPrompt, spinner } from "@cloudflare/cli/interactive";
5
+ import { runFrameworkGenerator } from "frameworks/index";
7
6
  import {
8
7
  copyFile,
9
8
  probePaths,
@@ -14,10 +13,11 @@ import {
14
13
  writeFile,
15
14
  writeJSON,
16
15
  } from "helpers/files";
17
- import { detectPackageManager } from "helpers/packages";
16
+ import { detectPackageManager } from "helpers/packageManagers";
17
+ import { installPackages } from "helpers/packages";
18
18
  import { getTemplatePath } from "../../src/templates";
19
19
  import type { TemplateConfig } from "../../src/templates";
20
- import type { C3Args, C3Context } from "types";
20
+ import type { C3Context } from "types";
21
21
 
22
22
  const { npm, npx } = detectPackageManager();
23
23
 
@@ -26,17 +26,15 @@ const generate = async (ctx: C3Context) => {
26
26
 
27
27
  await runFrameworkGenerator(ctx, [projectName]);
28
28
 
29
- copyFile(
30
- join(getTemplatePath(ctx), "wrangler.toml"),
31
- join(ctx.project.path, "wrangler.toml")
32
- );
33
- updateStatus("Created wrangler.toml file");
29
+ const wranglerConfig = readFile(join(getTemplatePath(ctx), "wrangler.jsonc"));
30
+ writeFile(join(ctx.project.path, "wrangler.jsonc"), wranglerConfig);
31
+ updateStatus("Created wrangler.jsonc file");
34
32
  };
35
33
 
36
- const updateNextConfig = () => {
34
+ const updateNextConfig = (usesTs: boolean) => {
37
35
  const s = spinner();
38
36
 
39
- const configFile = "next.config.mjs";
37
+ const configFile = `next.config.${usesTs ? "ts" : "mjs"}`;
40
38
  s.start(`Updating \`${configFile}\``);
41
39
 
42
40
  const configContent = readFile(configFile);
@@ -44,12 +42,12 @@ const updateNextConfig = () => {
44
42
  const updatedConfigFile =
45
43
  `import { setupDevPlatform } from '@cloudflare/next-on-pages/next-dev';
46
44
 
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
- }
45
+ // Here we use the @cloudflare/next-on-pages next-dev module to allow us to
46
+ // use bindings during local development (when running the application with
47
+ // \`next dev\`). This function is only necessary during development and
48
+ // has no impact outside of that. For more information see:
49
+ // https://github.com/cloudflare/next-on-pages/blob/main/internal-packages/next-dev/README.md
50
+ setupDevPlatform().catch(console.error);
53
51
 
54
52
  `.replace(/\n\t*/g, "\n") + configContent;
55
53
 
@@ -72,7 +70,7 @@ const configure = async (ctx: C3Context) => {
72
70
  ]);
73
71
 
74
72
  if (!path) {
75
- crash("Could not find the `/api` or `/app` directory");
73
+ throw new Error("Could not find the `/api` or `/app` directory");
76
74
  }
77
75
 
78
76
  const usesTs = usesTypescript(ctx);
@@ -80,7 +78,7 @@ const configure = async (ctx: C3Context) => {
80
78
  if (usesTs) {
81
79
  copyFile(
82
80
  join(getTemplatePath(ctx), "env.d.ts"),
83
- join(projectPath, "env.d.ts")
81
+ join(projectPath, "env.d.ts"),
84
82
  );
85
83
  updateStatus("Created an env.d.ts file");
86
84
  }
@@ -91,11 +89,11 @@ const configure = async (ctx: C3Context) => {
91
89
  await writeEslintrc(ctx);
92
90
  }
93
91
 
94
- updateNextConfig();
92
+ updateNextConfig(usesTs);
95
93
 
96
94
  copyFile(
97
95
  join(getTemplatePath(ctx), "README.md"),
98
- join(projectPath, "README.md")
96
+ join(projectPath, "README.md"),
99
97
  );
100
98
  updateStatus("Updated the README file");
101
99
 
@@ -103,20 +101,22 @@ const configure = async (ctx: C3Context) => {
103
101
  };
104
102
 
105
103
  export const shouldInstallNextOnPagesEslintPlugin = async (
106
- ctx: C3Context
104
+ ctx: C3Context,
107
105
  ): Promise<boolean> => {
108
106
  const eslintUsage = usesEslint(ctx);
109
107
 
110
- if (!eslintUsage.used) return false;
108
+ if (!eslintUsage.used) {
109
+ return false;
110
+ }
111
111
 
112
112
  if (eslintUsage.configType !== ".eslintrc.json") {
113
113
  warn(
114
- `Expected .eslintrc.json from Next.js scaffolding but found ${eslintUsage.configType} instead`
114
+ `Expected .eslintrc.json from Next.js scaffolding but found ${eslintUsage.configType} instead`,
115
115
  );
116
116
  return false;
117
117
  }
118
118
 
119
- return await processArgument(ctx.args, "eslint-plugin" as keyof C3Args, {
119
+ return await inputPrompt({
120
120
  type: "confirm",
121
121
  question: "Do you want to use the next-on-pages eslint-plugin?",
122
122
  label: "eslint-plugin",
@@ -125,7 +125,10 @@ export const shouldInstallNextOnPagesEslintPlugin = async (
125
125
  };
126
126
 
127
127
  export const writeEslintrc = async (ctx: C3Context): Promise<void> => {
128
- const eslintConfig = readJSON(`${ctx.project.path}/.eslintrc.json`);
128
+ const eslintConfig = readJSON(`${ctx.project.path}/.eslintrc.json`) as {
129
+ plugins: string[];
130
+ extends: string | string[];
131
+ };
129
132
 
130
133
  eslintConfig.plugins ??= [];
131
134
  eslintConfig.plugins.push("eslint-plugin-next-on-pages");
@@ -156,11 +159,9 @@ const addDevDependencies = async (installEslintPlugin: boolean) => {
156
159
  export default {
157
160
  configVersion: 1,
158
161
  id: "next",
162
+ frameworkCli: "create-next-app",
159
163
  platform: "pages",
160
- displayName: "Next",
161
- devScript: "dev",
162
- previewScript: "preview",
163
- deployScript: "deploy",
164
+ displayName: "Next.js",
164
165
  generate,
165
166
  configure,
166
167
  copyFiles: {
@@ -194,7 +195,7 @@ export default {
194
195
  },
195
196
  },
196
197
  },
197
- transformPackageJson: async () => {
198
+ transformPackageJson: async (_, ctx) => {
198
199
  const isNpm = npm === "npm";
199
200
  const isBun = npm === "bun";
200
201
  const isNpmOrBun = isNpm || isBun;
@@ -207,20 +208,16 @@ export default {
207
208
  return {
208
209
  scripts: {
209
210
  "pages:build": `${pmCommand} ${nextOnPagesCommand}`,
210
- preview: `${pagesBuildRunCommand} && wrangler pages dev .vercel/output/static`,
211
- deploy: `${pagesBuildRunCommand} && wrangler pages deploy .vercel/output/static`,
211
+ preview: `${pagesBuildRunCommand} && wrangler pages dev`,
212
+ deploy: `${pagesBuildRunCommand} && wrangler pages deploy`,
213
+ ...(usesTypescript(ctx) && {
214
+ "cf-typegen": `wrangler types --env-interface CloudflareEnv env.d.ts`,
215
+ }),
212
216
  },
213
217
  };
214
218
  },
215
- testFlags: [
216
- "--typescript",
217
- "--no-install",
218
- "--eslint",
219
- "--tailwind",
220
- "--src-dir",
221
- "--app",
222
- "--import-alias",
223
- "@/*",
224
- ],
219
+ devScript: "dev",
220
+ previewScript: "preview",
221
+ deployScript: "deploy",
225
222
  compatibilityFlags: ["nodejs_compat"],
226
223
  } as TemplateConfig;
@@ -1,7 +1,5 @@
1
+ // Generated by Wrangler
2
+ // by running `wrangler types --env-interface CloudflareEnv env.d.ts`
3
+
1
4
  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
5
  }
@@ -14,7 +14,7 @@ export default async function handler(req) {
14
14
  // )
15
15
  //
16
16
  // KV Example:
17
- // const myKv = getRequestContext().env.MY_KV
17
+ // const myKv = getRequestContext().env.MY_KV_NAMESPACE
18
18
  // await myKv.put('suffix', ' from a KV store!')
19
19
  // const suffix = await myKv.get('suffix')
20
20
  // responseText += suffix
@@ -15,7 +15,7 @@ export default async function handler(req: NextRequest) {
15
15
  // )
16
16
  //
17
17
  // KV Example:
18
- // const myKv = getRequestContext().env.MY_KV;
18
+ // const myKv = getRequestContext().env.MY_KV_NAMESPACE
19
19
  // await myKv.put('suffix', ' from a KV store!')
20
20
  // const suffix = await myKv.get('suffix')
21
21
  // responseText += suffix
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "<TBD>",
3
+ "compatibility_date": "<TBD>",
4
+ "compatibility_flags": [
5
+ "nodejs_compat"
6
+ ],
7
+ "pages_build_output_dir": ".vercel/output/static"
8
+ }
@@ -1,15 +1,17 @@
1
1
  import { logRaw } from "@cloudflare/cli";
2
2
  import { brandColor, dim } from "@cloudflare/cli/colors";
3
3
  import { spinner } from "@cloudflare/cli/interactive";
4
- import { transformFile } from "helpers/codemod";
5
- import { installPackages, runFrameworkGenerator } from "helpers/command";
6
- import { writeFile } from "helpers/files";
7
- import { detectPackageManager } from "helpers/packages";
4
+ import { runFrameworkGenerator } from "frameworks/index";
5
+ import { mergeObjectProperties, transformFile } from "helpers/codemod";
6
+ import { getLatestTypesEntrypoint } from "helpers/compatDate";
7
+ import { readFile, writeFile } from "helpers/files";
8
+ import { detectPackageManager } from "helpers/packageManagers";
9
+ import { installPackages } from "helpers/packages";
8
10
  import * as recast from "recast";
9
11
  import type { TemplateConfig } from "../../src/templates";
10
12
  import type { C3Context } from "types";
11
13
 
12
- const { npm } = detectPackageManager();
14
+ const { npm, name: pm } = detectPackageManager();
13
15
 
14
16
  const generate = async (ctx: C3Context) => {
15
17
  const gitFlag = ctx.args.git ? `--gitInit` : `--no-gitInit`;
@@ -22,18 +24,49 @@ const generate = async (ctx: C3Context) => {
22
24
  gitFlag,
23
25
  ]);
24
26
 
25
- writeFile("./.node-version", "17");
27
+ writeFile("./.node-version", "18");
26
28
 
27
29
  logRaw(""); // newline
28
30
  };
29
31
 
30
- const configure = async () => {
31
- await installPackages(["nitro-cloudflare-dev"], {
32
+ const configure = async (ctx: C3Context) => {
33
+ const packages = ["nitro-cloudflare-dev"];
34
+
35
+ // When using pnpm, explicitly add h3 package so the H3Event type declaration can be updated.
36
+ // Package managers other than pnpm will hoist the dependency, as will pnpm with `--shamefully-hoist`
37
+ if (pm === "pnpm") {
38
+ packages.push("h3");
39
+ }
40
+
41
+ await installPackages(packages, {
32
42
  dev: true,
33
43
  startText: "Installing nitro module `nitro-cloudflare-dev`",
34
44
  doneText: `${brandColor("installed")} ${dim(`via \`${npm} install\``)}`,
35
45
  });
36
46
  updateNuxtConfig();
47
+
48
+ updateEnvTypes(ctx);
49
+ };
50
+
51
+ const updateEnvTypes = (ctx: C3Context) => {
52
+ const filepath = "env.d.ts";
53
+
54
+ const s = spinner();
55
+ s.start(`Updating ${filepath}`);
56
+
57
+ let file = readFile(filepath);
58
+
59
+ let typesEntrypoint = `@cloudflare/workers-types`;
60
+ const latestEntrypoint = getLatestTypesEntrypoint(ctx);
61
+ if (latestEntrypoint) {
62
+ typesEntrypoint += `/${latestEntrypoint}`;
63
+ }
64
+
65
+ // Replace placeholder with actual types entrypoint
66
+ file = file.replace("WORKERS_TYPES_ENTRYPOINT", typesEntrypoint);
67
+ writeFile("env.d.ts", file);
68
+
69
+ s.stop(`${brandColor(`updated`)} ${dim(`\`${filepath}\``)}`);
37
70
  };
38
71
 
39
72
  const updateNuxtConfig = () => {
@@ -49,25 +82,24 @@ const updateNuxtConfig = () => {
49
82
  b.objectExpression([
50
83
  b.objectProperty(
51
84
  b.identifier("preset"),
52
- b.stringLiteral("cloudflare-pages")
85
+ b.stringLiteral("cloudflare-pages"),
53
86
  ),
54
- ])
87
+ ]),
55
88
  );
56
89
 
57
90
  const moduleDef = b.objectProperty(
58
91
  b.identifier("modules"),
59
- b.arrayExpression([b.stringLiteral("nitro-cloudflare-dev")])
92
+ b.arrayExpression([b.stringLiteral("nitro-cloudflare-dev")]),
60
93
  );
61
94
 
62
95
  transformFile(configFile, {
63
96
  visitCallExpression: function (n) {
64
97
  const callee = n.node.callee as recast.types.namedTypes.Identifier;
65
98
  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);
99
+ mergeObjectProperties(
100
+ n.node.arguments[0] as recast.types.namedTypes.ObjectExpression,
101
+ [presetDef, moduleDef],
102
+ );
71
103
  }
72
104
 
73
105
  return this.traverse(n);
@@ -80,20 +112,23 @@ const updateNuxtConfig = () => {
80
112
  const config: TemplateConfig = {
81
113
  configVersion: 1,
82
114
  id: "nuxt",
115
+ frameworkCli: "nuxi",
83
116
  platform: "pages",
117
+ displayName: "Nuxt",
84
118
  copyFiles: {
85
119
  path: "./templates",
86
120
  },
87
- displayName: "Nuxt",
88
- devScript: "dev",
89
- deployScript: "deploy",
90
121
  generate,
91
122
  configure,
92
123
  transformPackageJson: async () => ({
93
124
  scripts: {
94
- deploy: `${npm} run build && wrangler pages deploy ./dist`,
95
- preview: `${npm} run build && wrangler pages dev ./dist`,
125
+ deploy: `${npm} run build && wrangler pages deploy`,
126
+ preview: `${npm} run build && wrangler pages dev`,
127
+ "cf-typegen": `wrangler types`,
96
128
  },
97
129
  }),
130
+ devScript: "dev",
131
+ deployScript: "deploy",
132
+ previewScript: "preview",
98
133
  };
99
134
  export default config;
@@ -0,0 +1,14 @@
1
+ /// <reference types="WORKERS_TYPES_ENTRYPOINT" />
2
+
3
+ declare module "h3" {
4
+ interface H3EventContext {
5
+ cf: CfProperties;
6
+ cloudflare: {
7
+ request: Request;
8
+ env: Env;
9
+ context: ExecutionContext;
10
+ };
11
+ }
12
+ }
13
+
14
+ export {};
@@ -0,0 +1,4 @@
1
+ // Generated by Wrangler
2
+ // After adding bindings to `wrangler.jsonc`, regenerate this interface via `npm run cf-typegen`
3
+ interface Env {
4
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "<TBD>",
3
+ "compatibility_date": "<TBD>",
4
+ "compatibility_flags": [
5
+ "nodejs_compat"
6
+ ],
7
+ "pages_build_output_dir": "./dist"
8
+ }
@@ -2,6 +2,7 @@ export default {
2
2
  configVersion: 1,
3
3
  id: "openapi",
4
4
  displayName: "API starter (OpenAPI compliant)",
5
+ description: "Get started building a basic API on Workers",
5
6
  platform: "workers",
6
7
  copyFiles: {
7
8
  path: "./ts",
@@ -1,6 +1,6 @@
1
1
  # Cloudflare Workers OpenAPI 3.1
2
2
 
3
- This is a Cloudflare Worker with OpenAPI 3.1 using [itty-router-openapi](https://github.com/cloudflare/itty-router-openapi).
3
+ This is a Cloudflare Worker with OpenAPI 3.1 using [chanfana](https://github.com/cloudflare/chanfana) and [Hono](https://github.com/honojs/hono).
4
4
 
5
5
  This is an example project made to be used as a quick start into building OpenAPI compliant Workers that generates the
6
6
  `openapi.json` schema automatically from code and validates the incoming request to the defined parameters or request body.
@@ -16,10 +16,10 @@ This is an example project made to be used as a quick start into building OpenAP
16
16
 
17
17
  1. Your main router is defined in `src/index.ts`.
18
18
  2. Each endpoint has its own file in `src/endpoints/`.
19
- 3. For more information read the [itty-router-openapi official documentation](https://cloudflare.github.io/itty-router-openapi/).
19
+ 3. For more information read the [chanfana documentation](https://chanfana.pages.dev/) and [Hono documentation](https://hono.dev/docs).
20
20
 
21
21
  ## Development
22
22
 
23
23
  1. Run `wrangler dev` to start a local instance of the API.
24
- 2. Open `http://localhost:9000/` in your browser to see the Swagger interface where you can try the endpoints.
24
+ 2. Open `http://localhost:8787/` in your browser to see the Swagger interface where you can try the endpoints.
25
25
  3. Changes made in the `src/` folder will automatically trigger the server to reload, you only need to refresh the Swagger interface.
@@ -5,14 +5,17 @@
5
5
  "scripts": {
6
6
  "deploy": "wrangler deploy",
7
7
  "dev": "wrangler dev",
8
- "start": "wrangler dev"
8
+ "start": "wrangler dev",
9
+ "cf-typegen": "wrangler types"
9
10
  },
10
11
  "dependencies": {
11
- "@cloudflare/itty-router-openapi": "^1.0.1"
12
+ "chanfana": "^2.0.2",
13
+ "zod": "^3.23.8",
14
+ "hono": "^4.4.7"
12
15
  },
13
16
  "devDependencies": {
14
- "@types/node": "^20.5.7",
17
+ "@types/node": "20.8.3",
15
18
  "@types/service-worker-mock": "^2.0.1",
16
- "wrangler": "^3.0.0"
19
+ "wrangler": "^3.101.0"
17
20
  }
18
21
  }