wrangler 0.0.0-c1be44c8 → 0.0.0-c220a5fe
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -8
- package/package.json +12 -8
- package/templates/__tests__/tsconfig.json +1 -1
- package/templates/checked-fetch.js +9 -2
- package/templates/facade.d.ts +4 -1
- package/templates/middleware/loader-modules.ts +64 -11
- package/templates/middleware/middleware-d1-beta.d.ts +3 -0
- package/templates/middleware/middleware-multiworker-dev.d.ts +4 -0
- package/templates/middleware/middleware-multiworker-dev.ts +59 -0
- package/templates/middleware/middleware-serve-static-assets.d.ts +6 -0
- package/templates/middleware/middleware-serve-static-assets.ts +56 -0
- package/templates/pages-template-plugin.ts +12 -2
- package/templates/pages-template-worker.ts +11 -2
- package/templates/tsconfig.json +1 -1
- package/wrangler-dist/cli.d.ts +58 -52
- package/wrangler-dist/cli.js +8649 -7838
- package/templates/__tests__/tsconfig.tsbuildinfo +0 -1
- package/templates/d1-beta-facade.js +0 -244
- package/templates/first-party-worker-module-facade.ts +0 -19
- package/templates/format-dev-errors.ts +0 -34
- package/templates/serve-static-assets.ts +0 -66
- package/templates/service-bindings-module-facade.js +0 -55
- package/templates/service-bindings-sw-facade.js +0 -42
- package/templates/tsconfig.tsbuildinfo +0 -1
package/README.md
CHANGED
|
@@ -6,8 +6,6 @@
|
|
|
6
6
|
<a href="https://discord.gg/CloudflareDev"><img alt="Discord" src="https://img.shields.io/discord/595317990191398933?color=%23F48120&style=flat-square"></a>
|
|
7
7
|
</section>
|
|
8
8
|
|
|
9
|
-
> This package is for wrangler v2.x, released first in May 2022. If you're looking for v1.x of the `@cloudflare/wrangler` package, visit https://www.npmjs.com/package/@cloudflare/wrangler / https://github.com/cloudflare/wrangler-legacy.
|
|
10
|
-
|
|
11
9
|
`wrangler` is a command line tool for building [Cloudflare Workers](https://workers.cloudflare.com/).
|
|
12
10
|
|
|
13
11
|
## Quick Start
|
|
@@ -26,7 +24,7 @@ npx wrangler deploy index.js --name my-worker
|
|
|
26
24
|
|
|
27
25
|
```bash
|
|
28
26
|
# Generate a new project
|
|
29
|
-
npx wrangler init my-worker
|
|
27
|
+
npx wrangler init my-worker --no-delegate-c3
|
|
30
28
|
# try it out
|
|
31
29
|
cd my-worker && npm run start
|
|
32
30
|
# and then deploy it
|
|
@@ -43,15 +41,15 @@ $ npm install wrangler --save-dev
|
|
|
43
41
|
|
|
44
42
|
Wrangler is configured via a `wrangler.toml` file in the project root. When utilizing the `wrangler init` command, a `wrangler.toml` file will be created for you.
|
|
45
43
|
|
|
46
|
-
|
|
44
|
+
Example:
|
|
47
45
|
|
|
48
46
|
```toml
|
|
49
|
-
main = "./src/index.ts" # init w/ TypeScript
|
|
50
47
|
name = "my-worker"
|
|
51
|
-
|
|
48
|
+
main = "./src/index.ts" # init w/ TypeScript
|
|
49
|
+
compatibility_date = "YYYY-MM-DD"
|
|
52
50
|
```
|
|
53
51
|
|
|
54
|
-
|
|
52
|
+
For more detailed information about configuration, refer to the [documentation](https://developers.cloudflare.com/workers/wrangler/configuration/).
|
|
55
53
|
|
|
56
54
|
## Commands
|
|
57
55
|
|
|
@@ -67,7 +65,7 @@ Start a local development server, with live reloading and devtools.
|
|
|
67
65
|
|
|
68
66
|
Publish the given script to the worldwide Cloudflare network.
|
|
69
67
|
|
|
70
|
-
For more commands and options, refer to the [documentation](https://developers.cloudflare.com/workers/
|
|
68
|
+
For more commands and options, refer to the [documentation](https://developers.cloudflare.com/workers/wrangler/commands/).
|
|
71
69
|
|
|
72
70
|
## Pages
|
|
73
71
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wrangler",
|
|
3
|
-
"version": "0.0.0-
|
|
3
|
+
"version": "0.0.0-c220a5fe",
|
|
4
4
|
"description": "Command-line interface for all things Cloudflare Workers",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"wrangler",
|
|
@@ -53,17 +53,19 @@
|
|
|
53
53
|
"assert-git-version": "node -r esbuild-register scripts/assert-git-version.ts",
|
|
54
54
|
"build": "npm run clean && npm run bundle && npm run emit-types",
|
|
55
55
|
"bundle": "node -r esbuild-register scripts/bundle.ts",
|
|
56
|
-
"check:
|
|
56
|
+
"check:lint": "eslint .",
|
|
57
|
+
"check:type": "tsc",
|
|
57
58
|
"clean": "rimraf wrangler-dist miniflare-dist emitted-types",
|
|
58
59
|
"dev": "npm run clean && concurrently -c black,blue --kill-others-on-fail false 'npm run bundle -- --watch' 'npm run check:type -- --watch --preserveWatchOutput'",
|
|
59
60
|
"emit-types": "tsc -p tsconfig.emit.json && node -r esbuild-register scripts/emit-types.ts",
|
|
60
61
|
"prepublishOnly": "SOURCEMAPS=false npm run build",
|
|
61
62
|
"start": "npm run bundle && cross-env NODE_OPTIONS=--enable-source-maps ./bin/wrangler.js",
|
|
62
63
|
"test": "npm run assert-git-version && jest",
|
|
63
|
-
"test-watch": "npm run test -- --runInBand --testTimeout=50000 --watch",
|
|
64
64
|
"test:ci": "npm run test -- --coverage",
|
|
65
65
|
"test:debug": "npm run test -- --silent=false --verbose=true",
|
|
66
|
-
"test:e2e": "vitest --
|
|
66
|
+
"test:e2e": "vitest --test-timeout 240000 --single-thread --dir ./e2e run",
|
|
67
|
+
"test:watch": "npm run test -- --runInBand --testTimeout=50000 --watch",
|
|
68
|
+
"type:tests": "tsc -p ./src/__tests__/tsconfig.json && tsc -p ./e2e/tsconfig.json"
|
|
67
69
|
},
|
|
68
70
|
"jest": {
|
|
69
71
|
"coverageReporters": [
|
|
@@ -81,7 +83,7 @@
|
|
|
81
83
|
"<rootDir>/src/__tests__/jest.setup.ts"
|
|
82
84
|
],
|
|
83
85
|
"testRegex": "src/__tests__/.*\\.(test|spec)\\.[jt]sx?$",
|
|
84
|
-
"testTimeout":
|
|
86
|
+
"testTimeout": 50000,
|
|
85
87
|
"transform": {
|
|
86
88
|
"^.+\\.c?(t|j)sx?$": [
|
|
87
89
|
"esbuild-jest",
|
|
@@ -101,7 +103,7 @@
|
|
|
101
103
|
"blake3-wasm": "^2.1.5",
|
|
102
104
|
"chokidar": "^3.5.3",
|
|
103
105
|
"esbuild": "0.16.3",
|
|
104
|
-
"miniflare": "
|
|
106
|
+
"miniflare": "3.20230807.0",
|
|
105
107
|
"nanoid": "^3.3.3",
|
|
106
108
|
"path-to-regexp": "^6.2.0",
|
|
107
109
|
"selfsigned": "^2.0.1",
|
|
@@ -109,8 +111,10 @@
|
|
|
109
111
|
"xxhash-wasm": "^1.0.1"
|
|
110
112
|
},
|
|
111
113
|
"devDependencies": {
|
|
114
|
+
"@cloudflare/eslint-config-worker": "*",
|
|
112
115
|
"@cloudflare/types": "^6.18.4",
|
|
113
|
-
"@cloudflare/workers-
|
|
116
|
+
"@cloudflare/workers-tsconfig": "*",
|
|
117
|
+
"@cloudflare/workers-types": "^4.20230724.0",
|
|
114
118
|
"@iarna/toml": "^3.0.0",
|
|
115
119
|
"@microsoft/api-extractor": "^7.28.3",
|
|
116
120
|
"@types/better-sqlite3": "^7.6.0",
|
|
@@ -168,7 +172,7 @@
|
|
|
168
172
|
"remove-accents-esm": "^0.0.1",
|
|
169
173
|
"semiver": "^1.1.0",
|
|
170
174
|
"serve-static": "^1.15.0",
|
|
171
|
-
"shellac": "^0.
|
|
175
|
+
"shellac": "^0.8.0",
|
|
172
176
|
"signal-exit": "^3.0.7",
|
|
173
177
|
"strip-ansi": "^7.0.1",
|
|
174
178
|
"supports-color": "^9.2.2",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const urls = new Set();
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
function checkURL(request, init) {
|
|
4
4
|
const url =
|
|
5
5
|
request instanceof URL
|
|
6
6
|
? request
|
|
@@ -19,5 +19,12 @@ export function checkedFetch(request, init) {
|
|
|
19
19
|
);
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
-
return globalThis.fetch(request, init);
|
|
23
22
|
}
|
|
23
|
+
|
|
24
|
+
globalThis.fetch = new Proxy(globalThis.fetch, {
|
|
25
|
+
apply(target, thisArg, argArray) {
|
|
26
|
+
const [request, init] = argArray;
|
|
27
|
+
checkURL(request, init);
|
|
28
|
+
return Reflect.apply(target, thisArg, argArray);
|
|
29
|
+
},
|
|
30
|
+
});
|
package/templates/facade.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
declare module "__ENTRY_POINT__" {
|
|
2
2
|
import type { Middleware } from "./middleware/common";
|
|
3
|
-
const worker: ExportedHandler & {
|
|
3
|
+
const worker: ExportedHandler & {
|
|
4
|
+
middleware?: Middleware[];
|
|
5
|
+
envWrappers: ((env: Record<string, unknown>) => Record<string, unknown>)[];
|
|
6
|
+
};
|
|
4
7
|
export default worker;
|
|
5
8
|
}
|
|
6
9
|
|
|
@@ -36,17 +36,68 @@ class __Facade_ScheduledController__ implements ScheduledController {
|
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
const __facade_modules_fetch__:
|
|
40
|
-
|
|
39
|
+
const __facade_modules_fetch__: ExportedHandlerFetchHandler = function (
|
|
40
|
+
request,
|
|
41
|
+
env,
|
|
42
|
+
ctx
|
|
43
|
+
) {
|
|
44
|
+
if (worker.fetch === undefined)
|
|
45
|
+
throw new Error("Handler does not export a fetch() function.");
|
|
41
46
|
return worker.fetch(request, env, ctx);
|
|
42
47
|
};
|
|
43
48
|
|
|
44
|
-
|
|
45
|
-
|
|
49
|
+
function getMaskedEnv(rawEnv: unknown) {
|
|
50
|
+
let env = rawEnv as Record<string, unknown>;
|
|
51
|
+
if (worker.envWrappers && worker.envWrappers.length > 0) {
|
|
52
|
+
for (const wrapFn of worker.envWrappers) {
|
|
53
|
+
env = wrapFn(env);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return env;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* This type is here to cause a type error if a new export handler is added to
|
|
61
|
+
* `ExportHandler` without it being included in the `facade` below.
|
|
62
|
+
*/
|
|
63
|
+
type MissingExportHandlers = Omit<
|
|
64
|
+
Required<ExportedHandler>,
|
|
65
|
+
"tail" | "trace" | "scheduled" | "queue" | "test" | "email" | "fetch"
|
|
66
|
+
>;
|
|
67
|
+
|
|
68
|
+
let registeredMiddleware = false;
|
|
69
|
+
|
|
70
|
+
const facade: ExportedHandler<unknown> & MissingExportHandlers = {
|
|
71
|
+
...(worker.tail && {
|
|
72
|
+
tail: maskHandlerEnv(worker.tail),
|
|
73
|
+
}),
|
|
74
|
+
...(worker.trace && {
|
|
75
|
+
trace: maskHandlerEnv(worker.trace),
|
|
76
|
+
}),
|
|
77
|
+
...(worker.scheduled && {
|
|
78
|
+
scheduled: maskHandlerEnv(worker.scheduled),
|
|
79
|
+
}),
|
|
80
|
+
...(worker.queue && {
|
|
81
|
+
queue: maskHandlerEnv(worker.queue),
|
|
82
|
+
}),
|
|
83
|
+
...(worker.test && {
|
|
84
|
+
test: maskHandlerEnv(worker.test),
|
|
85
|
+
}),
|
|
86
|
+
...(worker.email && {
|
|
87
|
+
email: maskHandlerEnv(worker.email),
|
|
88
|
+
}),
|
|
89
|
+
|
|
90
|
+
fetch(request, rawEnv, ctx) {
|
|
91
|
+
const env = getMaskedEnv(rawEnv);
|
|
46
92
|
// Get the chain of middleware from the worker object
|
|
47
93
|
if (worker.middleware && worker.middleware.length > 0) {
|
|
48
|
-
|
|
49
|
-
|
|
94
|
+
// Make sure we only register middleware once:
|
|
95
|
+
// https://github.com/cloudflare/workers-sdk/issues/2386#issuecomment-1614715911
|
|
96
|
+
if (!registeredMiddleware) {
|
|
97
|
+
registeredMiddleware = true;
|
|
98
|
+
for (const middleware of worker.middleware) {
|
|
99
|
+
__facade_register__(middleware);
|
|
100
|
+
}
|
|
50
101
|
}
|
|
51
102
|
|
|
52
103
|
const __facade_modules_dispatch__: Dispatcher = function (type, init) {
|
|
@@ -71,14 +122,16 @@ const facade: ExportedHandler<unknown> = {
|
|
|
71
122
|
// We didn't have any middleware so we can skip the invocation chain,
|
|
72
123
|
// and just call the fetch handler directly
|
|
73
124
|
|
|
74
|
-
// We "don't care" if this is undefined as we want to have the same
|
|
125
|
+
// We "don't care" if this is undefined as we want to have the same behavior
|
|
75
126
|
// as if the worker completely bypassed middleware.
|
|
76
|
-
return
|
|
127
|
+
return __facade_modules_fetch__(request, env, ctx);
|
|
77
128
|
}
|
|
78
129
|
},
|
|
79
|
-
scheduled: worker.scheduled,
|
|
80
|
-
queue: worker.queue,
|
|
81
|
-
trace: worker.trace,
|
|
82
130
|
};
|
|
83
131
|
|
|
132
|
+
type HandlerFn<D, R> = (data: D, env: unknown, ctx: ExecutionContext) => R;
|
|
133
|
+
function maskHandlerEnv<D, R>(handler: HandlerFn<D, R>): HandlerFn<D, R> {
|
|
134
|
+
return (data, env, ctx) => handler(data, getMaskedEnv(env), ctx);
|
|
135
|
+
}
|
|
136
|
+
|
|
84
137
|
export default facade;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/// <reference path="middleware-multiworker-dev.d.ts"/>
|
|
3
|
+
|
|
4
|
+
import { workers } from "config:middleware/multiworker-dev";
|
|
5
|
+
import type { WorkerRegistry } from "../../src/dev-registry";
|
|
6
|
+
|
|
7
|
+
export function wrap(env: Record<string, unknown>) {
|
|
8
|
+
const facadeEnv = { ...env };
|
|
9
|
+
// For every Worker definition that's available,
|
|
10
|
+
// create a fetcher for it on the facade env.
|
|
11
|
+
// for const [name, binding] of env
|
|
12
|
+
// if Workers[name]
|
|
13
|
+
// const details = Workers[name];
|
|
14
|
+
|
|
15
|
+
for (const [name, details] of Object.entries(workers as WorkerRegistry)) {
|
|
16
|
+
if (details) {
|
|
17
|
+
facadeEnv[name] = {
|
|
18
|
+
async fetch(...reqArgs: Parameters<Fetcher["fetch"]>) {
|
|
19
|
+
const reqFromArgs = new Request(...reqArgs);
|
|
20
|
+
if (details.headers) {
|
|
21
|
+
for (const [key, value] of Object.entries(details.headers)) {
|
|
22
|
+
// In remote mode, you need to add a couple of headers
|
|
23
|
+
// to make sure it's talking to the 'dev' preview session
|
|
24
|
+
// (much like wrangler dev already does via proxy.ts)
|
|
25
|
+
reqFromArgs.headers.set(key, value);
|
|
26
|
+
}
|
|
27
|
+
return (env[name] as Fetcher).fetch(reqFromArgs);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const url = new URL(reqFromArgs.url);
|
|
31
|
+
if (details.protocol !== undefined) {
|
|
32
|
+
url.protocol = details.protocol;
|
|
33
|
+
}
|
|
34
|
+
if (details.host !== undefined) {
|
|
35
|
+
url.host = details.host;
|
|
36
|
+
}
|
|
37
|
+
if (details.port !== undefined) {
|
|
38
|
+
url.port = details.port.toString();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const request = new Request(url.toString(), reqFromArgs);
|
|
42
|
+
return fetch(request);
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
} else {
|
|
46
|
+
// This means there's no dev binding available.
|
|
47
|
+
// Let's use whatever's available, or put a shim with a message.
|
|
48
|
+
facadeEnv[name] = facadeEnv[name] || {
|
|
49
|
+
async fetch() {
|
|
50
|
+
return new Response(
|
|
51
|
+
`You should start up wrangler dev --local on the ${name} worker`,
|
|
52
|
+
{ status: 404 }
|
|
53
|
+
);
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return facadeEnv;
|
|
59
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/// <reference path="middleware-serve-static-assets.d.ts"/>
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
getAssetFromKV,
|
|
5
|
+
NotFoundError,
|
|
6
|
+
MethodNotAllowedError,
|
|
7
|
+
serveSinglePageApp,
|
|
8
|
+
} from "@cloudflare/kv-asset-handler";
|
|
9
|
+
import type { Options } from "@cloudflare/kv-asset-handler";
|
|
10
|
+
import { spaMode, cacheControl } from "config:middleware/serve-static-assets";
|
|
11
|
+
import type * as kvAssetHandler from "@cloudflare/kv-asset-handler";
|
|
12
|
+
import manifest from "__STATIC_CONTENT_MANIFEST";
|
|
13
|
+
const ASSET_MANIFEST = JSON.parse(manifest);
|
|
14
|
+
|
|
15
|
+
import type { Middleware } from "./common";
|
|
16
|
+
|
|
17
|
+
const staticAssets: Middleware = async (request, env, _ctx, middlewareCtx) => {
|
|
18
|
+
let options: Partial<Options> = {
|
|
19
|
+
ASSET_MANIFEST,
|
|
20
|
+
ASSET_NAMESPACE: env.__STATIC_CONTENT,
|
|
21
|
+
cacheControl: cacheControl,
|
|
22
|
+
mapRequestToAsset: spaMode ? serveSinglePageApp : undefined,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const page = await (getAssetFromKV as typeof kvAssetHandler.getAssetFromKV)(
|
|
27
|
+
{
|
|
28
|
+
request,
|
|
29
|
+
waitUntil(promise) {
|
|
30
|
+
return _ctx.waitUntil(promise);
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
options
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
// allow headers to be altered
|
|
37
|
+
const response = new Response(page.body, page);
|
|
38
|
+
|
|
39
|
+
response.headers.set("X-XSS-Protection", "1; mode=block");
|
|
40
|
+
response.headers.set("X-Content-Type-Options", "nosniff");
|
|
41
|
+
response.headers.set("X-Frame-Options", "DENY");
|
|
42
|
+
response.headers.set("Referrer-Policy", "unsafe-url");
|
|
43
|
+
response.headers.set("Feature-Policy", "none");
|
|
44
|
+
|
|
45
|
+
return response;
|
|
46
|
+
} catch (e) {
|
|
47
|
+
if (e instanceof NotFoundError || e instanceof MethodNotAllowedError) {
|
|
48
|
+
// if a known error is thrown then serve from actual worker
|
|
49
|
+
return await middlewareCtx.next(request, env);
|
|
50
|
+
}
|
|
51
|
+
// otherwise it's a real error, so throw it
|
|
52
|
+
throw e;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export default staticAssets;
|
|
@@ -122,7 +122,8 @@ function* executeRequest(request: Request, relativePathname: string) {
|
|
|
122
122
|
export default function (pluginArgs: unknown) {
|
|
123
123
|
const onRequest: PagesPluginFunction = async (workerContext) => {
|
|
124
124
|
let { request } = workerContext;
|
|
125
|
-
const { env, next
|
|
125
|
+
const { env, next } = workerContext;
|
|
126
|
+
let { data } = workerContext;
|
|
126
127
|
|
|
127
128
|
const url = new URL(request.url);
|
|
128
129
|
// TODO: Replace this with something actually legible.
|
|
@@ -149,7 +150,16 @@ export default function (pluginArgs: unknown) {
|
|
|
149
150
|
functionPath: workerContext.functionPath + path,
|
|
150
151
|
next: pluginNext,
|
|
151
152
|
params,
|
|
152
|
-
data
|
|
153
|
+
get data() {
|
|
154
|
+
return data;
|
|
155
|
+
},
|
|
156
|
+
set data(value) {
|
|
157
|
+
if (typeof value !== "object" || value === null) {
|
|
158
|
+
throw new Error("context.data must be an object");
|
|
159
|
+
}
|
|
160
|
+
// user has overriden context.data, so we need to merge it with the existing data
|
|
161
|
+
data = value;
|
|
162
|
+
},
|
|
153
163
|
pluginArgs,
|
|
154
164
|
env,
|
|
155
165
|
waitUntil: workerContext.waitUntil.bind(workerContext),
|
|
@@ -120,7 +120,7 @@ export default {
|
|
|
120
120
|
) {
|
|
121
121
|
let request = originalRequest;
|
|
122
122
|
const handlerIterator = executeRequest(request);
|
|
123
|
-
|
|
123
|
+
let data = {}; // arbitrary data the user can set between functions
|
|
124
124
|
let isFailOpen = false;
|
|
125
125
|
|
|
126
126
|
const next = async (input?: RequestInfo, init?: RequestInit) => {
|
|
@@ -141,7 +141,16 @@ export default {
|
|
|
141
141
|
functionPath: path,
|
|
142
142
|
next,
|
|
143
143
|
params,
|
|
144
|
-
data
|
|
144
|
+
get data() {
|
|
145
|
+
return data;
|
|
146
|
+
},
|
|
147
|
+
set data(value) {
|
|
148
|
+
if (typeof value !== "object" || value === null) {
|
|
149
|
+
throw new Error("context.data must be an object");
|
|
150
|
+
}
|
|
151
|
+
// user has overriden context.data, so we need to merge it with the existing data
|
|
152
|
+
data = value;
|
|
153
|
+
},
|
|
145
154
|
env,
|
|
146
155
|
waitUntil: workerContext.waitUntil.bind(workerContext),
|
|
147
156
|
passThroughOnException: () => {
|
package/templates/tsconfig.json
CHANGED