From 69bc7d59b94c88069943ef13c9de09266837f4a5 Mon Sep 17 00:00:00 2001 From: Josh Howard Date: Mon, 22 Jan 2024 06:41:20 -0500 Subject: [PATCH] Add hello world example for Durable Objects (#4747) --- .../create-cloudflare/e2e-tests/cli.test.ts | 2 +- packages/create-cloudflare/src/templateMap.ts | 4 + .../js/.editorconfig | 13 ++ .../hello-world-durable-object/js/.gitignore | 172 ++++++++++++++++++ .../hello-world-durable-object/js/.prettierrc | 6 + .../js/package.json | 13 ++ .../js/src/index.js | 65 +++++++ .../js/wrangler.toml | 51 ++++++ .../ts/.editorconfig | 13 ++ .../hello-world-durable-object/ts/.gitignore | 172 ++++++++++++++++++ .../hello-world-durable-object/ts/.prettierrc | 6 + .../ts/package.json | 15 ++ .../ts/src/index.ts | 78 ++++++++ .../ts/tsconfig.json | 101 ++++++++++ .../ts/wrangler.toml | 51 ++++++ 15 files changed, 761 insertions(+), 1 deletion(-) create mode 100644 packages/create-cloudflare/templates/hello-world-durable-object/js/.editorconfig create mode 100644 packages/create-cloudflare/templates/hello-world-durable-object/js/.gitignore create mode 100644 packages/create-cloudflare/templates/hello-world-durable-object/js/.prettierrc create mode 100644 packages/create-cloudflare/templates/hello-world-durable-object/js/package.json create mode 100644 packages/create-cloudflare/templates/hello-world-durable-object/js/src/index.js create mode 100644 packages/create-cloudflare/templates/hello-world-durable-object/js/wrangler.toml create mode 100644 packages/create-cloudflare/templates/hello-world-durable-object/ts/.editorconfig create mode 100644 packages/create-cloudflare/templates/hello-world-durable-object/ts/.gitignore create mode 100644 packages/create-cloudflare/templates/hello-world-durable-object/ts/.prettierrc create mode 100644 packages/create-cloudflare/templates/hello-world-durable-object/ts/package.json create mode 100644 packages/create-cloudflare/templates/hello-world-durable-object/ts/src/index.ts create mode 100644 packages/create-cloudflare/templates/hello-world-durable-object/ts/tsconfig.json create mode 100644 packages/create-cloudflare/templates/hello-world-durable-object/ts/wrangler.toml diff --git a/packages/create-cloudflare/e2e-tests/cli.test.ts b/packages/create-cloudflare/e2e-tests/cli.test.ts index 73571016d702..7481a775ac53 100644 --- a/packages/create-cloudflare/e2e-tests/cli.test.ts +++ b/packages/create-cloudflare/e2e-tests/cli.test.ts @@ -107,7 +107,7 @@ describe.skipIf(frameworkToTest || isQuarantineMode())( }, { matcher: /What type of application do you want to create/, - input: [keys.down, keys.down, keys.enter], + input: [keys.down, keys.down, keys.down, keys.enter], }, { matcher: /Do you want to use TypeScript/, diff --git a/packages/create-cloudflare/src/templateMap.ts b/packages/create-cloudflare/src/templateMap.ts index 56fdb98c7592..fa62e65fe6b9 100644 --- a/packages/create-cloudflare/src/templateMap.ts +++ b/packages/create-cloudflare/src/templateMap.ts @@ -13,6 +13,10 @@ export const templateMap: Record = { label: `"Hello World" Worker`, handler: runWorkersGenerator, }, + "hello-world-durable-object": { + label: `"Hello World" Durable Object`, + handler: runWorkersGenerator, + }, webFramework: { label: "Website or web app", handler: runPagesGenerator, diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/js/.editorconfig b/packages/create-cloudflare/templates/hello-world-durable-object/js/.editorconfig new file mode 100644 index 000000000000..64ab2601f9be --- /dev/null +++ b/packages/create-cloudflare/templates/hello-world-durable-object/js/.editorconfig @@ -0,0 +1,13 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = tab +tab_width = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.yml] +indent_style = space diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/js/.gitignore b/packages/create-cloudflare/templates/hello-world-durable-object/js/.gitignore new file mode 100644 index 000000000000..3b0fe33c47f1 --- /dev/null +++ b/packages/create-cloudflare/templates/hello-world-durable-object/js/.gitignore @@ -0,0 +1,172 @@ +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# wrangler project + +.dev.vars +.wrangler/ diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/js/.prettierrc b/packages/create-cloudflare/templates/hello-world-durable-object/js/.prettierrc new file mode 100644 index 000000000000..5c7b5d3c7a75 --- /dev/null +++ b/packages/create-cloudflare/templates/hello-world-durable-object/js/.prettierrc @@ -0,0 +1,6 @@ +{ + "printWidth": 140, + "singleQuote": true, + "semi": true, + "useTabs": true +} diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/js/package.json b/packages/create-cloudflare/templates/hello-world-durable-object/js/package.json new file mode 100644 index 000000000000..717bd9e05a9e --- /dev/null +++ b/packages/create-cloudflare/templates/hello-world-durable-object/js/package.json @@ -0,0 +1,13 @@ +{ + "name": "", + "version": "0.0.0", + "private": true, + "scripts": { + "deploy": "wrangler deploy", + "dev": "wrangler dev", + "start": "wrangler dev" + }, + "devDependencies": { + "wrangler": "^3.0.0" + } +} diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/js/src/index.js b/packages/create-cloudflare/templates/hello-world-durable-object/js/src/index.js new file mode 100644 index 000000000000..aed5450764e0 --- /dev/null +++ b/packages/create-cloudflare/templates/hello-world-durable-object/js/src/index.js @@ -0,0 +1,65 @@ +/** + * Welcome to Cloudflare Workers! This is your first Durable Objects application. + * + * - Run `npm run dev` in your terminal to start a development server + * - Open a browser tab at http://localhost:8787/ to see your Durable Object in action + * - Run `npm run deploy` to publish your application + * + * Learn more at https://developers.cloudflare.com/durable-objects + */ + +/** + * Env provides a mechanism to reference bindings declared in wrangler.toml within JavaScript + * + * @typedef {Object} Env + * @property {DurableObjectNamespace} MY_DURABLE_OBJECT - The Durable Object namespace binding + */ + +/** A Durable Object's behavior is defined in an exported Javascript class */ +export class MyDurableObject { + /** + * The constructor is invoked once upon creation of the Durable Object, i.e. the first call to + * `DurableObjectStub::get` for a given identifier + * + * @param {DurableObjectState} state - The interface for interacting with Durable Object state + * @param {Env} env - The interface to reference bindings declared in wrangler.toml + */ + constructor(state, env) {} + + /** + * The Durable Object fetch handler will be invoked when a Durable Object instance receives a + * request from a Worker via an associated stub + * + * @param {Request} request - The request submitted to a Durable Object instance from a Worker + * @returns {Promise} The response to be sent back to the Worker + */ + async fetch(request) { + return new Response('Hello World'); + } +} + +export default { + /** + * This is the standard fetch handler for a Cloudflare Worker + * + * @param {Request} request - The request submitted to the Worker from the client + * @param {Env} env - The interface to reference bindings declared in wrangler.toml + * @param {ExecutionContext} ctx - The execution context of the Worker + * @returns {Promise} The response to be sent back to the client + */ + async fetch(request, env, ctx) { + // We will create a `DurableObjectId` using the pathname from the Worker request + // This id refers to a unique instance of our 'MyDurableObject' class above + let id = env.MY_DURABLE_OBJECT.idFromName(new URL(request.url).pathname); + + // This stub creates a communication channel with the Durable Object instance + // The Durable Object constructor will be invoked upon the first call for a given id + let stub = env.MY_DURABLE_OBJECT.get(id); + + // We call `fetch()` on the stub to send a request to the Durable Object instance + // The Durable Object instance will invoke its fetch handler to handle the request + let response = await stub.fetch(request); + + return response; + }, +}; diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/js/wrangler.toml b/packages/create-cloudflare/templates/hello-world-durable-object/js/wrangler.toml new file mode 100644 index 000000000000..53d618eee131 --- /dev/null +++ b/packages/create-cloudflare/templates/hello-world-durable-object/js/wrangler.toml @@ -0,0 +1,51 @@ +name = "" +main = "src/index.js" +compatibility_date = "" + +# Variable bindings. These are arbitrary, plaintext strings (similar to environment variables) +# Note: Use secrets to store sensitive data. +# Docs: https://developers.cloudflare.com/workers/platform/environment-variables +# [vars] +# MY_VARIABLE = "production_value" + +# Bind a KV Namespace. Use KV as persistent storage for small key-value pairs. +# Docs: https://developers.cloudflare.com/workers/runtime-apis/kv +# [[kv_namespaces]] +# binding = "MY_KV_NAMESPACE" +# id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + +# Bind an R2 Bucket. Use R2 to store arbitrarily large blobs of data, such as files. +# Docs: https://developers.cloudflare.com/r2/api/workers/workers-api-usage/ +# [[r2_buckets]] +# binding = "MY_BUCKET" +# bucket_name = "my-bucket" + +# Bind a Queue producer. Use this binding to schedule an arbitrary task that may be processed later by a Queue consumer. +# Docs: https://developers.cloudflare.com/queues/get-started +# [[queues.producers]] +# binding = "MY_QUEUE" +# queue = "my-queue" + +# Bind a Queue consumer. Queue Consumers can retrieve tasks scheduled by Producers to act on them. +# Docs: https://developers.cloudflare.com/queues/get-started +# [[queues.consumers]] +# queue = "my-queue" + +# Bind another Worker service. Use this binding to call another Worker without network overhead. +# Docs: https://developers.cloudflare.com/workers/platform/services +# [[services]] +# binding = "MY_SERVICE" +# service = "my-service" + +# Bind a Durable Object. Durable objects are a scale-to-zero compute primitive based on the actor model. +# Durable Objects can live for as long as needed. Use these when you need a long-running "server", such as in realtime apps. +# Docs: https://developers.cloudflare.com/workers/runtime-apis/durable-objects +[[durable_objects.bindings]] +name = "MY_DURABLE_OBJECT" +class_name = "MyDurableObject" + +# Durable Object migrations. +# Docs: https://developers.cloudflare.com/workers/learning/using-durable-objects#configure-durable-object-classes-with-migrations +[[migrations]] +tag = "v1" +new_classes = ["MyDurableObject"] diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/ts/.editorconfig b/packages/create-cloudflare/templates/hello-world-durable-object/ts/.editorconfig new file mode 100644 index 000000000000..64ab2601f9be --- /dev/null +++ b/packages/create-cloudflare/templates/hello-world-durable-object/ts/.editorconfig @@ -0,0 +1,13 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = tab +tab_width = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.yml] +indent_style = space diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/ts/.gitignore b/packages/create-cloudflare/templates/hello-world-durable-object/ts/.gitignore new file mode 100644 index 000000000000..3b0fe33c47f1 --- /dev/null +++ b/packages/create-cloudflare/templates/hello-world-durable-object/ts/.gitignore @@ -0,0 +1,172 @@ +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# wrangler project + +.dev.vars +.wrangler/ diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/ts/.prettierrc b/packages/create-cloudflare/templates/hello-world-durable-object/ts/.prettierrc new file mode 100644 index 000000000000..5c7b5d3c7a75 --- /dev/null +++ b/packages/create-cloudflare/templates/hello-world-durable-object/ts/.prettierrc @@ -0,0 +1,6 @@ +{ + "printWidth": 140, + "singleQuote": true, + "semi": true, + "useTabs": true +} diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/ts/package.json b/packages/create-cloudflare/templates/hello-world-durable-object/ts/package.json new file mode 100644 index 000000000000..7e1a4b476aee --- /dev/null +++ b/packages/create-cloudflare/templates/hello-world-durable-object/ts/package.json @@ -0,0 +1,15 @@ +{ + "name": "", + "version": "0.0.0", + "private": true, + "scripts": { + "deploy": "wrangler deploy", + "dev": "wrangler dev", + "start": "wrangler dev" + }, + "devDependencies": { + "@cloudflare/workers-types": "^4.20231218.0", + "typescript": "^5.0.4", + "wrangler": "^3.0.0" + } +} diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/ts/src/index.ts b/packages/create-cloudflare/templates/hello-world-durable-object/ts/src/index.ts new file mode 100644 index 000000000000..03d45ed0b14c --- /dev/null +++ b/packages/create-cloudflare/templates/hello-world-durable-object/ts/src/index.ts @@ -0,0 +1,78 @@ +/** + * Welcome to Cloudflare Workers! This is your first Durable Objects application. + * + * - Run `npm run dev` in your terminal to start a development server + * - Open a browser tab at http://localhost:8787/ to see your Durable Object in action + * - Run `npm run deploy` to publish your application + * + * Learn more at https://developers.cloudflare.com/durable-objects + */ + +/** + * Associate bindings declared in wrangler.toml with the TypeScript type system + */ +export interface Env { + // Example binding to KV. Learn more at https://developers.cloudflare.com/workers/runtime-apis/kv/ + // MY_KV_NAMESPACE: KVNamespace; + // + // Example binding to Durable Object. Learn more at https://developers.cloudflare.com/workers/runtime-apis/durable-objects/ + MY_DURABLE_OBJECT: DurableObjectNamespace; + // + // Example binding to R2. Learn more at https://developers.cloudflare.com/workers/runtime-apis/r2/ + // MY_BUCKET: R2Bucket; + // + // Example binding to a Service. Learn more at https://developers.cloudflare.com/workers/runtime-apis/service-bindings/ + // MY_SERVICE: Fetcher; + // + // Example binding to a Queue. Learn more at https://developers.cloudflare.com/queues/javascript-apis/ + // MY_QUEUE: Queue; +} + +/** A Durable Object's behavior is defined in an exported Javascript class */ +export class MyDurableObject { + /** + * The constructor is invoked once upon creation of the Durable Object, i.e. the first call to + * `DurableObjectStub::get` for a given identifier + * + * @param state - The interface for interacting with Durable Object state + * @param env - The interface to reference bindings declared in wrangler.toml + */ + constructor(state: DurableObjectState, env: Env) {} + + /** + * The Durable Object fetch handler will be invoked when a Durable Object instance receives a + * request from a Worker via an associated stub + * + * @param request - The request submitted to a Durable Object instance from a Worker + * @returns The response to be sent back to the Worker + */ + async fetch(request: Request): Promise { + return new Response('Hello World'); + } +} + +export default { + /** + * This is the standard fetch handler for a Cloudflare Worker + * + * @param request - The request submitted to the Worker from the client + * @param env - The interface to reference bindings declared in wrangler.toml + * @param ctx - The execution context of the Worker + * @returns The response to be sent back to the client + */ + async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { + // We will create a `DurableObjectId` using the pathname from the Worker request + // This id refers to a unique instance of our 'MyDurableObject' class above + let id: DurableObjectId = env.MY_DURABLE_OBJECT.idFromName(new URL(request.url).pathname); + + // This stub creates a communication channel with the Durable Object instance + // The Durable Object constructor will be invoked upon the first call for a given id + let stub: DurableObjectStub = env.MY_DURABLE_OBJECT.get(id); + + // We call `fetch()` on the stub to send a request to the Durable Object instance + // The Durable Object instance will invoke its fetch handler to handle the request + let response = await stub.fetch(request); + + return response; + }, +}; diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/ts/tsconfig.json b/packages/create-cloudflare/templates/hello-world-durable-object/ts/tsconfig.json new file mode 100644 index 000000000000..2cb9189a162d --- /dev/null +++ b/packages/create-cloudflare/templates/hello-world-durable-object/ts/tsconfig.json @@ -0,0 +1,101 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2021" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "lib": ["es2021"] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, + "jsx": "react" /* Specify what JSX code is generated. */, + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "es2022" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ + "types": ["@cloudflare/workers-types"] /* Specify type package names to be included without being referenced in a source file. */, + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + "resolveJsonModule": true /* Enable importing .json files */, + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */, + "checkJs": false /* Enable error reporting in type-checked JavaScript files. */, + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + "noEmit": true /* Disable emitting files from a compilation. */, + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + "isolatedModules": true /* Ensure that each file can be safely transpiled without relying on other imports. */, + "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */, + // "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/packages/create-cloudflare/templates/hello-world-durable-object/ts/wrangler.toml b/packages/create-cloudflare/templates/hello-world-durable-object/ts/wrangler.toml new file mode 100644 index 000000000000..319f78257b89 --- /dev/null +++ b/packages/create-cloudflare/templates/hello-world-durable-object/ts/wrangler.toml @@ -0,0 +1,51 @@ +name = "" +main = "src/index.ts" +compatibility_date = "" + +# Variable bindings. These are arbitrary, plaintext strings (similar to environment variables) +# Note: Use secrets to store sensitive data. +# Docs: https://developers.cloudflare.com/workers/platform/environment-variables +# [vars] +# MY_VARIABLE = "production_value" + +# Bind a KV Namespace. Use KV as persistent storage for small key-value pairs. +# Docs: https://developers.cloudflare.com/workers/runtime-apis/kv +# [[kv_namespaces]] +# binding = "MY_KV_NAMESPACE" +# id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + +# Bind an R2 Bucket. Use R2 to store arbitrarily large blobs of data, such as files. +# Docs: https://developers.cloudflare.com/r2/api/workers/workers-api-usage/ +# [[r2_buckets]] +# binding = "MY_BUCKET" +# bucket_name = "my-bucket" + +# Bind a Queue producer. Use this binding to schedule an arbitrary task that may be processed later by a Queue consumer. +# Docs: https://developers.cloudflare.com/queues/get-started +# [[queues.producers]] +# binding = "MY_QUEUE" +# queue = "my-queue" + +# Bind a Queue consumer. Queue Consumers can retrieve tasks scheduled by Producers to act on them. +# Docs: https://developers.cloudflare.com/queues/get-started +# [[queues.consumers]] +# queue = "my-queue" + +# Bind another Worker service. Use this binding to call another Worker without network overhead. +# Docs: https://developers.cloudflare.com/workers/platform/services +# [[services]] +# binding = "MY_SERVICE" +# service = "my-service" + +# Bind a Durable Object. Durable objects are a scale-to-zero compute primitive based on the actor model. +# Durable Objects can live for as long as needed. Use these when you need a long-running "server", such as in realtime apps. +# Docs: https://developers.cloudflare.com/workers/runtime-apis/durable-objects +[[durable_objects.bindings]] +name = "MY_DURABLE_OBJECT" +class_name = "MyDurableObject" + +# Durable Object migrations. +# Docs: https://developers.cloudflare.com/workers/learning/using-durable-objects#configure-durable-object-classes-with-migrations +[[migrations]] +tag = "v1" +new_classes = ["MyDurableObject"]