wrangler 0.0.0-eab9542 → 0.0.0-eaf71b86c
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 +29 -13
- package/bin/wrangler.js +50 -88
- package/config-schema.json +3074 -0
- package/package.json +196 -157
- package/templates/__tests__/pages-dev-util.test.ts +128 -0
- package/templates/__tests__/tsconfig-sanity.ts +12 -0
- package/templates/__tests__/tsconfig.json +8 -0
- package/templates/checked-fetch.js +19 -6
- package/templates/facade.d.ts +19 -0
- package/templates/gitignore +2 -3
- package/templates/init-tests/test-jest-new-worker.js +23 -0
- package/templates/init-tests/test-vitest-new-worker.js +24 -0
- package/templates/init-tests/test-vitest-new-worker.ts +25 -0
- package/templates/middleware/common.ts +67 -0
- package/templates/middleware/loader-modules.ts +134 -0
- package/templates/middleware/loader-sw.ts +229 -0
- package/templates/middleware/middleware-ensure-req-body-drained.ts +18 -0
- package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
- package/templates/middleware/middleware-mock-analytics-engine.d.ts +3 -0
- package/templates/middleware/middleware-mock-analytics-engine.ts +30 -0
- package/templates/middleware/middleware-pretty-error.ts +40 -0
- package/templates/middleware/middleware-scheduled.ts +29 -0
- package/templates/middleware/middleware-serve-static-assets.d.ts +6 -0
- package/templates/middleware/middleware-serve-static-assets.ts +56 -0
- package/templates/modules-watch-stub.js +4 -0
- package/templates/new-worker-scheduled.ts +1 -1
- package/templates/new-worker.js +1 -1
- package/templates/new-worker.ts +4 -1
- package/templates/pages-dev-pipeline.ts +32 -0
- package/templates/pages-dev-util.ts +55 -0
- package/templates/pages-shim.ts +9 -0
- package/templates/pages-template-plugin.ts +53 -18
- package/templates/pages-template-worker.ts +49 -12
- package/templates/startDevWorker/InspectorProxyWorker.ts +664 -0
- package/templates/startDevWorker/ProxyWorker.ts +336 -0
- package/templates/tsconfig-sanity.ts +11 -0
- package/templates/tsconfig.init.json +22 -0
- package/templates/tsconfig.json +5 -102
- package/wrangler-dist/InspectorProxyWorker.js +464 -0
- package/wrangler-dist/InspectorProxyWorker.js.map +6 -0
- package/wrangler-dist/ProxyWorker.js +241 -0
- package/wrangler-dist/ProxyWorker.js.map +6 -0
- package/wrangler-dist/cli.d.ts +26465 -0
- package/wrangler-dist/cli.js +198587 -108581
- package/wrangler-dist/wasm-sync.wasm +0 -0
- package/Cloudflare_CA.pem +0 -18
- package/import_meta_url.js +0 -3
- package/miniflare-config-stubs/.env.empty +0 -0
- package/miniflare-config-stubs/package.empty.json +0 -1
- package/miniflare-config-stubs/wrangler.empty.toml +0 -0
- package/miniflare-dist/index.mjs +0 -4894
- package/src/__tests__/config-cache-without-cache-dir.test.ts +0 -38
- package/src/__tests__/config-cache.test.ts +0 -42
- package/src/__tests__/configuration.test.ts +0 -3946
- package/src/__tests__/dev.test.tsx +0 -1159
- package/src/__tests__/guess-worker-format.test.ts +0 -85
- package/src/__tests__/helpers/clipboardy-mock.js +0 -4
- package/src/__tests__/helpers/cmd-shim.d.ts +0 -11
- package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
- package/src/__tests__/helpers/mock-account-id.ts +0 -48
- package/src/__tests__/helpers/mock-bin.ts +0 -36
- package/src/__tests__/helpers/mock-cfetch.ts +0 -211
- package/src/__tests__/helpers/mock-console.ts +0 -97
- package/src/__tests__/helpers/mock-dialogs.ts +0 -153
- package/src/__tests__/helpers/mock-http-server.ts +0 -46
- package/src/__tests__/helpers/mock-istty.ts +0 -74
- package/src/__tests__/helpers/mock-kv.ts +0 -33
- package/src/__tests__/helpers/mock-oauth-flow.ts +0 -250
- package/src/__tests__/helpers/mock-process.ts +0 -39
- package/src/__tests__/helpers/mock-stdin.ts +0 -108
- package/src/__tests__/helpers/mock-web-socket.ts +0 -29
- package/src/__tests__/helpers/run-in-tmp.ts +0 -39
- package/src/__tests__/helpers/run-wrangler.ts +0 -16
- package/src/__tests__/helpers/write-worker-source.ts +0 -31
- package/src/__tests__/helpers/write-wrangler-toml.ts +0 -17
- package/src/__tests__/https-options.test.ts +0 -130
- package/src/__tests__/index.test.ts +0 -262
- package/src/__tests__/init.test.ts +0 -1992
- package/src/__tests__/jest.setup.ts +0 -107
- package/src/__tests__/kv.test.ts +0 -1619
- package/src/__tests__/logger.test.ts +0 -141
- package/src/__tests__/package-manager.test.ts +0 -353
- package/src/__tests__/pages.test.ts +0 -1254
- package/src/__tests__/parse.test.ts +0 -330
- package/src/__tests__/publish.test.ts +0 -6569
- package/src/__tests__/pubsub.test.ts +0 -367
- package/src/__tests__/r2.test.ts +0 -233
- package/src/__tests__/route.test.ts +0 -45
- package/src/__tests__/secret.test.ts +0 -486
- package/src/__tests__/tail.test.ts +0 -690
- package/src/__tests__/user.test.ts +0 -143
- package/src/__tests__/whoami.test.tsx +0 -220
- package/src/__tests__/worker-namespace.test.ts +0 -327
- package/src/abort.d.ts +0 -3
- package/src/api/dev.ts +0 -52
- package/src/api/index.ts +0 -1
- package/src/bundle-reporter.tsx +0 -29
- package/src/bundle.ts +0 -212
- package/src/cfetch/index.ts +0 -121
- package/src/cfetch/internal.ts +0 -149
- package/src/cli.ts +0 -27
- package/src/config/README.md +0 -107
- package/src/config/config.ts +0 -243
- package/src/config/diagnostics.ts +0 -80
- package/src/config/environment.ts +0 -453
- package/src/config/index.ts +0 -238
- package/src/config/validation-helpers.ts +0 -584
- package/src/config/validation.ts +0 -1745
- package/src/config-cache.ts +0 -83
- package/src/create-worker-preview.ts +0 -255
- package/src/create-worker-upload-form.ts +0 -263
- package/src/dev/dev-vars.ts +0 -36
- package/src/dev/dev.tsx +0 -417
- package/src/dev/local.tsx +0 -352
- package/src/dev/remote.tsx +0 -382
- package/src/dev/use-esbuild.ts +0 -150
- package/src/dev.tsx +0 -538
- package/src/dialogs.tsx +0 -135
- package/src/durable.ts +0 -102
- package/src/entry.ts +0 -328
- package/src/environment-variables.ts +0 -35
- package/src/errors.ts +0 -11
- package/src/generate.ts +0 -33
- package/src/git-client.ts +0 -42
- package/src/https-options.ts +0 -123
- package/src/index.tsx +0 -1871
- package/src/init.ts +0 -549
- package/src/inspect.ts +0 -662
- package/src/intl-polyfill.d.ts +0 -139
- package/src/is-interactive.ts +0 -12
- package/src/kv.ts +0 -408
- package/src/logger.ts +0 -73
- package/src/miniflare-cli/README.md +0 -30
- package/src/miniflare-cli/enum-keys.ts +0 -17
- package/src/miniflare-cli/index.ts +0 -53
- package/src/miniflare-cli/request-context.ts +0 -40
- package/src/module-collection.ts +0 -258
- package/src/open-in-browser.ts +0 -17
- package/src/package-manager.ts +0 -174
- package/src/pages/build.tsx +0 -202
- package/src/pages/constants.ts +0 -7
- package/src/pages/deployments.tsx +0 -101
- package/src/pages/dev.tsx +0 -964
- package/src/pages/functions/buildPlugin.ts +0 -105
- package/src/pages/functions/buildWorker.ts +0 -151
- package/src/pages/functions/filepath-routing.test.ts +0 -234
- package/src/pages/functions/filepath-routing.ts +0 -189
- package/src/pages/functions/identifiers.ts +0 -78
- package/src/pages/functions/routes.ts +0 -151
- package/src/pages/index.tsx +0 -84
- package/src/pages/projects.tsx +0 -157
- package/src/pages/publish.tsx +0 -335
- package/src/pages/types.ts +0 -40
- package/src/pages/upload.tsx +0 -384
- package/src/pages/utils.ts +0 -12
- package/src/parse.ts +0 -286
- package/src/paths.ts +0 -26
- package/src/preview.ts +0 -31
- package/src/proxy.ts +0 -476
- package/src/publish.ts +0 -767
- package/src/pubsub/index.ts +0 -286
- package/src/pubsub/pubsub-commands.tsx +0 -577
- package/src/r2.ts +0 -50
- package/src/selfsigned.d.ts +0 -29
- package/src/sites.tsx +0 -372
- package/src/tail/filters.ts +0 -279
- package/src/tail/index.ts +0 -299
- package/src/tail/printing.ts +0 -67
- package/src/update-check.ts +0 -19
- package/src/user/choose-account.tsx +0 -60
- package/src/user/env-vars.ts +0 -46
- package/src/user/generate-auth-url.ts +0 -33
- package/src/user/generate-random-state.ts +0 -16
- package/src/user/index.ts +0 -3
- package/src/user/user.tsx +0 -1161
- package/src/whoami.tsx +0 -90
- package/src/worker-namespace.ts +0 -190
- package/src/worker.ts +0 -191
- package/src/zones.ts +0 -76
- package/templates/static-asset-facade.js +0 -43
package/src/tail/index.ts
DELETED
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
import WebSocket from "ws";
|
|
2
|
-
import { version as packageVersion } from "../../package.json";
|
|
3
|
-
import { fetchResult } from "../cfetch";
|
|
4
|
-
import type { TailFilterMessage, Outcome } from "./filters";
|
|
5
|
-
export type { TailCLIFilters } from "./filters";
|
|
6
|
-
export { translateCLICommandToFilterMessage } from "./filters";
|
|
7
|
-
export { jsonPrintLogs, prettyPrintLogs } from "./printing";
|
|
8
|
-
import type { Request } from "undici";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* When creating a Tail, the response from the API contains
|
|
12
|
-
* - an ID used for identifying the tail
|
|
13
|
-
* - a URL to a WebSocket connection available for the tail to connect to
|
|
14
|
-
* - an expiration date when the tail is no longer guaranteed to be valid
|
|
15
|
-
*/
|
|
16
|
-
type TailCreationApiResponse = {
|
|
17
|
-
id: string;
|
|
18
|
-
url: string;
|
|
19
|
-
expires_at: Date;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Generate a URL that, when `cfetch`ed, creates a tail.
|
|
24
|
-
*
|
|
25
|
-
* https://api.cloudflare.com/#worker-tail-logs-start-tail
|
|
26
|
-
*
|
|
27
|
-
* @param accountId the account ID associated with the worker to tail
|
|
28
|
-
* @param workerName the name of the worker to tail
|
|
29
|
-
* @returns a `cfetch`-ready URL for creating a new tail
|
|
30
|
-
*/
|
|
31
|
-
function makeCreateTailUrl(
|
|
32
|
-
accountId: string,
|
|
33
|
-
workerName: string,
|
|
34
|
-
env: string | undefined
|
|
35
|
-
): string {
|
|
36
|
-
return env
|
|
37
|
-
? `/accounts/${accountId}/workers/services/${workerName}/environments/${env}/tails`
|
|
38
|
-
: `/accounts/${accountId}/workers/scripts/${workerName}/tails`;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Generate a URL that, when `cfetch`ed, deletes a tail
|
|
43
|
-
*
|
|
44
|
-
* https://api.cloudflare.com/#worker-tail-logs-delete-tail
|
|
45
|
-
*
|
|
46
|
-
* @param accountId the account ID associated with the worker we're tailing
|
|
47
|
-
* @param workerName the name of the worker we're tailing
|
|
48
|
-
* @param tailId the ID of the tail we want to delete
|
|
49
|
-
* @returns a `cfetch`-ready URL for deleting a tail
|
|
50
|
-
*/
|
|
51
|
-
function makeDeleteTailUrl(
|
|
52
|
-
accountId: string,
|
|
53
|
-
workerName: string,
|
|
54
|
-
tailId: string,
|
|
55
|
-
env: string | undefined
|
|
56
|
-
): string {
|
|
57
|
-
return env
|
|
58
|
-
? `/accounts/${accountId}/workers/services/${workerName}/environments/${env}/tails/${tailId}`
|
|
59
|
-
: `/accounts/${accountId}/workers/scripts/${workerName}/tails/${tailId}`;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Create and connect to a tail.
|
|
64
|
-
*
|
|
65
|
-
* Under the hood, this function
|
|
66
|
-
* - Registers a new Tail with the API
|
|
67
|
-
* - Connects to the tail worker
|
|
68
|
-
* - Sends any filters over the connection
|
|
69
|
-
*
|
|
70
|
-
* @param accountId the account ID associated with the worker to tail
|
|
71
|
-
* @param workerName the name of the worker to tail
|
|
72
|
-
* @param message a `TailFilterMessage` to send up to the tail worker
|
|
73
|
-
* @returns a websocket connection, an expiration, and a function to call to delete the tail
|
|
74
|
-
*/
|
|
75
|
-
export async function createTail(
|
|
76
|
-
accountId: string,
|
|
77
|
-
workerName: string,
|
|
78
|
-
message: TailFilterMessage,
|
|
79
|
-
env: string | undefined
|
|
80
|
-
): Promise<{
|
|
81
|
-
tail: WebSocket;
|
|
82
|
-
expiration: Date;
|
|
83
|
-
deleteTail: () => Promise<void>;
|
|
84
|
-
}> {
|
|
85
|
-
// create the tail
|
|
86
|
-
const createTailUrl = makeCreateTailUrl(accountId, workerName, env);
|
|
87
|
-
const {
|
|
88
|
-
id: tailId,
|
|
89
|
-
url: websocketUrl,
|
|
90
|
-
expires_at: expiration,
|
|
91
|
-
} = await fetchResult<TailCreationApiResponse>(createTailUrl, {
|
|
92
|
-
method: "POST",
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
// delete the tail (not yet!)
|
|
96
|
-
const deleteUrl = makeDeleteTailUrl(accountId, workerName, tailId, env);
|
|
97
|
-
async function deleteTail() {
|
|
98
|
-
await fetchResult(deleteUrl, { method: "DELETE" });
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// connect to the tail
|
|
102
|
-
const tail = new WebSocket(websocketUrl, "trace-v1", {
|
|
103
|
-
headers: {
|
|
104
|
-
"Sec-WebSocket-Protocol": "trace-v1", // needs to be `trace-v1` to be accepted
|
|
105
|
-
"User-Agent": `wrangler-js/${packageVersion}`,
|
|
106
|
-
},
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
// send filters when we open up
|
|
110
|
-
tail.on("open", function () {
|
|
111
|
-
tail.send(
|
|
112
|
-
JSON.stringify(message),
|
|
113
|
-
{ binary: false, compress: false, mask: false, fin: true },
|
|
114
|
-
(err) => {
|
|
115
|
-
if (err) {
|
|
116
|
-
throw err;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
);
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
return { tail, expiration, deleteTail };
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Everything captured by the trace worker and sent to us via
|
|
127
|
-
* `wrangler tail` is structured JSON that deserializes to this type.
|
|
128
|
-
*/
|
|
129
|
-
export type TailEventMessage = {
|
|
130
|
-
/**
|
|
131
|
-
* Whether the execution of this worker succeeded or failed
|
|
132
|
-
*/
|
|
133
|
-
outcome: Outcome;
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* The name of the script we're tailing
|
|
137
|
-
*/
|
|
138
|
-
scriptName?: string;
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Any exceptions raised by the worker
|
|
142
|
-
*/
|
|
143
|
-
exceptions: {
|
|
144
|
-
/**
|
|
145
|
-
* The name of the exception.
|
|
146
|
-
*/
|
|
147
|
-
name: string;
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* The error message
|
|
151
|
-
*/
|
|
152
|
-
message: unknown;
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* When the exception was raised/thrown
|
|
156
|
-
*/
|
|
157
|
-
timestamp: number;
|
|
158
|
-
}[];
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Any logs sent out by the worker
|
|
162
|
-
*/
|
|
163
|
-
logs: {
|
|
164
|
-
message: unknown[];
|
|
165
|
-
level: string; // TODO: make this a union of possible values
|
|
166
|
-
timestamp: number;
|
|
167
|
-
}[];
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* When the event was triggered
|
|
171
|
-
*/
|
|
172
|
-
eventTimestamp: number;
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* The event that triggered the worker. In the case of an HTTP request,
|
|
176
|
-
* this will be a RequestEvent. If it's a cron trigger, it'll be a
|
|
177
|
-
* ScheduledEvent.
|
|
178
|
-
*
|
|
179
|
-
* Until workers-types exposes individual types for export, we'll have
|
|
180
|
-
* to just re-define these types ourselves.
|
|
181
|
-
*/
|
|
182
|
-
event: RequestEvent | ScheduledEvent | undefined | null;
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* A request that triggered worker execution
|
|
187
|
-
*/
|
|
188
|
-
|
|
189
|
-
export type RequestEvent = {
|
|
190
|
-
request: Pick<Request, "url" | "method" | "headers"> & {
|
|
191
|
-
/**
|
|
192
|
-
* Cloudflare-specific properties
|
|
193
|
-
* https://developers.cloudflare.com/workers/runtime-apis/request#incomingrequestcfproperties
|
|
194
|
-
*/
|
|
195
|
-
cf: {
|
|
196
|
-
/**
|
|
197
|
-
* How long (in ms) it took for the client's TCP connection to make a
|
|
198
|
-
* round trip to the worker and back. For all my gamers out there,
|
|
199
|
-
* this is the request's ping
|
|
200
|
-
*/
|
|
201
|
-
clientTcpRtt?: number;
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Longitude and Latitude of where the request originated from
|
|
205
|
-
*/
|
|
206
|
-
longitude?: string;
|
|
207
|
-
latitude?: string;
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* What cipher was used to establish the TLS connection
|
|
211
|
-
*/
|
|
212
|
-
tlsCipher: string;
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Which continent the request came from.
|
|
216
|
-
*/
|
|
217
|
-
continent?: "NA";
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* ASN of the incoming request
|
|
221
|
-
*/
|
|
222
|
-
asn: number;
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* The country the incoming request is coming from
|
|
226
|
-
*/
|
|
227
|
-
country?: string;
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* The TLS version the connection used
|
|
231
|
-
*/
|
|
232
|
-
tlsVersion: string;
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* The colo that processed the request (i.e. the airport code
|
|
236
|
-
* of the closest city to the server that spun up the worker)
|
|
237
|
-
*/
|
|
238
|
-
colo: string;
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* The timezone where the request came from
|
|
242
|
-
*/
|
|
243
|
-
timezone?: string;
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* The city where the request came from
|
|
247
|
-
*/
|
|
248
|
-
city?: string;
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* The browser-requested prioritization information in the request object
|
|
252
|
-
*/
|
|
253
|
-
requestPriority?: string;
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* Which version of HTTP the request came over e.g. "HTTP/2"
|
|
257
|
-
*/
|
|
258
|
-
httpProtocol: string;
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* The region where the request originated from
|
|
262
|
-
*/
|
|
263
|
-
region?: string;
|
|
264
|
-
regionCode?: string;
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* The organization which owns the ASN of the incoming request, for example, Google Cloud.
|
|
268
|
-
*/
|
|
269
|
-
asOrganization: string;
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Metro code (DMA) of the incoming request, for example, "635".
|
|
273
|
-
*/
|
|
274
|
-
metroCode?: string;
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Postal code of the incoming request, for example, "78701".
|
|
278
|
-
*/
|
|
279
|
-
postalCode?: string;
|
|
280
|
-
};
|
|
281
|
-
};
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* An event that was triggered at a certain time
|
|
286
|
-
*/
|
|
287
|
-
export type ScheduledEvent = {
|
|
288
|
-
/**
|
|
289
|
-
* The cron pattern that matched when this event fired
|
|
290
|
-
*/
|
|
291
|
-
cron: string;
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* The time this worker was scheduled to run.
|
|
295
|
-
* For some reason, this doesn't...work correctly when we
|
|
296
|
-
* do it directly as a Date. So parse it later on your own.
|
|
297
|
-
*/
|
|
298
|
-
scheduledTime: number;
|
|
299
|
-
};
|
package/src/tail/printing.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { logger } from "../logger";
|
|
2
|
-
import type { RequestEvent, ScheduledEvent, TailEventMessage } from ".";
|
|
3
|
-
import type { Outcome } from "./filters";
|
|
4
|
-
import type WebSocket from "ws";
|
|
5
|
-
|
|
6
|
-
export function prettyPrintLogs(data: WebSocket.RawData): void {
|
|
7
|
-
const eventMessage: TailEventMessage = JSON.parse(data.toString());
|
|
8
|
-
|
|
9
|
-
if (isScheduledEvent(eventMessage.event)) {
|
|
10
|
-
const cronPattern = eventMessage.event.cron;
|
|
11
|
-
const datetime = new Date(
|
|
12
|
-
eventMessage.event.scheduledTime
|
|
13
|
-
).toLocaleString();
|
|
14
|
-
const outcome = prettifyOutcome(eventMessage.outcome);
|
|
15
|
-
|
|
16
|
-
logger.log(`"${cronPattern}" @ ${datetime} - ${outcome}`);
|
|
17
|
-
} else {
|
|
18
|
-
const requestMethod = eventMessage.event?.request.method.toUpperCase();
|
|
19
|
-
const url = eventMessage.event?.request.url;
|
|
20
|
-
const outcome = prettifyOutcome(eventMessage.outcome);
|
|
21
|
-
const datetime = new Date(eventMessage.eventTimestamp).toLocaleString();
|
|
22
|
-
|
|
23
|
-
logger.log(
|
|
24
|
-
url
|
|
25
|
-
? `${requestMethod} ${url} - ${outcome} @ ${datetime}`
|
|
26
|
-
: `[missing request] - ${outcome} @ ${datetime}`
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (eventMessage.logs.length > 0) {
|
|
31
|
-
eventMessage.logs.forEach(({ level, message }) => {
|
|
32
|
-
logger.log(` (${level})`, ...message);
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (eventMessage.exceptions.length > 0) {
|
|
37
|
-
eventMessage.exceptions.forEach(({ name, message }) => {
|
|
38
|
-
logger.error(` ${name}:`, message);
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function jsonPrintLogs(data: WebSocket.RawData): void {
|
|
44
|
-
console.log(JSON.stringify(JSON.parse(data.toString()), null, 2));
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function isScheduledEvent(
|
|
48
|
-
event: RequestEvent | ScheduledEvent | undefined | null
|
|
49
|
-
): event is ScheduledEvent {
|
|
50
|
-
return Boolean(event && "cron" in event);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function prettifyOutcome(outcome: Outcome): string {
|
|
54
|
-
switch (outcome) {
|
|
55
|
-
case "ok":
|
|
56
|
-
return "Ok";
|
|
57
|
-
case "canceled":
|
|
58
|
-
return "Canceled";
|
|
59
|
-
case "exceededCpu":
|
|
60
|
-
return "Exceeded CPU Limit";
|
|
61
|
-
case "exception":
|
|
62
|
-
return "Exception Thrown";
|
|
63
|
-
case "unknown":
|
|
64
|
-
default:
|
|
65
|
-
return "Unknown";
|
|
66
|
-
}
|
|
67
|
-
}
|
package/src/update-check.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
|
-
import checkForUpdate from "update-check";
|
|
3
|
-
import pkg from "../package.json";
|
|
4
|
-
|
|
5
|
-
export async function updateCheck(): Promise<string> {
|
|
6
|
-
let update = null;
|
|
7
|
-
try {
|
|
8
|
-
// default cache for update check is 1 day
|
|
9
|
-
update = await checkForUpdate(pkg, {
|
|
10
|
-
distTag: pkg.version.startsWith("0.0.0") ? "beta" : "latest",
|
|
11
|
-
});
|
|
12
|
-
} catch (err) {
|
|
13
|
-
// ignore error
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
if (update) return `(update available ${chalk.green(update.latest)})`;
|
|
17
|
-
|
|
18
|
-
return "";
|
|
19
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { Text } from "ink";
|
|
2
|
-
import SelectInput from "ink-select-input";
|
|
3
|
-
import React from "react";
|
|
4
|
-
import { fetchListResult } from "../cfetch";
|
|
5
|
-
import { logger } from "../logger";
|
|
6
|
-
import { getCloudflareAccountIdFromEnv } from "./env-vars";
|
|
7
|
-
|
|
8
|
-
export type ChooseAccountItem = {
|
|
9
|
-
id: string;
|
|
10
|
-
name: string;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* A component that allows the user to select from a list of available accounts.
|
|
15
|
-
*/
|
|
16
|
-
export function ChooseAccount(props: {
|
|
17
|
-
accounts: ChooseAccountItem[];
|
|
18
|
-
onSelect: (account: { name: string; id: string }) => void;
|
|
19
|
-
onError: (error: Error) => void;
|
|
20
|
-
}) {
|
|
21
|
-
return (
|
|
22
|
-
<>
|
|
23
|
-
<Text bold>Select an account from below:</Text>
|
|
24
|
-
<SelectInput
|
|
25
|
-
items={props.accounts.map((item) => ({
|
|
26
|
-
key: item.id,
|
|
27
|
-
label: item.name,
|
|
28
|
-
value: item,
|
|
29
|
-
}))}
|
|
30
|
-
onSelect={(item) => {
|
|
31
|
-
logger.log(`Using account: "${item.value.name} - ${item.value.id}"`);
|
|
32
|
-
props.onSelect({ id: item.value.id, name: item.value.name });
|
|
33
|
-
}}
|
|
34
|
-
/>
|
|
35
|
-
</>
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Infer a list of available accounts for the current user.
|
|
41
|
-
*/
|
|
42
|
-
export async function getAccountChoices(): Promise<ChooseAccountItem[]> {
|
|
43
|
-
const accountIdFromEnv = getCloudflareAccountIdFromEnv();
|
|
44
|
-
if (accountIdFromEnv) {
|
|
45
|
-
return [{ id: accountIdFromEnv, name: "" }];
|
|
46
|
-
} else {
|
|
47
|
-
const response = await fetchListResult<{
|
|
48
|
-
account: ChooseAccountItem;
|
|
49
|
-
}>(`/memberships`);
|
|
50
|
-
const accounts = response.map((r) => r.account);
|
|
51
|
-
if (accounts.length === 0) {
|
|
52
|
-
throw new Error(
|
|
53
|
-
"Failed to automatically retrieve account IDs for the logged in user.\n" +
|
|
54
|
-
"In a non-interactive environment, it is mandatory to specify an account ID, either by assigning its value to CLOUDFLARE_ACCOUNT_ID, or as `account_id` in your `wrangler.toml` file."
|
|
55
|
-
);
|
|
56
|
-
} else {
|
|
57
|
-
return accounts;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
package/src/user/env-vars.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { getEnvironmentVariableFactory } from "../environment-variables";
|
|
2
|
-
|
|
3
|
-
export type ApiCredentials =
|
|
4
|
-
| {
|
|
5
|
-
apiToken: string;
|
|
6
|
-
}
|
|
7
|
-
| {
|
|
8
|
-
authKey: string;
|
|
9
|
-
authEmail: string;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
const getCloudflareAPITokenFromEnv = getEnvironmentVariableFactory({
|
|
13
|
-
variableName: "CLOUDFLARE_API_TOKEN",
|
|
14
|
-
deprecatedName: "CF_API_TOKEN",
|
|
15
|
-
});
|
|
16
|
-
const getCloudflareGlobalAuthKeyFromEnv = getEnvironmentVariableFactory({
|
|
17
|
-
variableName: "CLOUDFLARE_API_KEY",
|
|
18
|
-
deprecatedName: "CF_API_KEY",
|
|
19
|
-
});
|
|
20
|
-
const getCloudflareGlobalAuthEmailFromEnv = getEnvironmentVariableFactory({
|
|
21
|
-
variableName: "CLOUDFLARE_EMAIL",
|
|
22
|
-
deprecatedName: "CF_EMAIL",
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Try to read an API token or Global Auth from the environment.
|
|
27
|
-
*/
|
|
28
|
-
export function getAuthFromEnv(): ApiCredentials | undefined {
|
|
29
|
-
const globalApiKey = getCloudflareGlobalAuthKeyFromEnv();
|
|
30
|
-
const globalApiEmail = getCloudflareGlobalAuthEmailFromEnv();
|
|
31
|
-
const apiToken = getCloudflareAPITokenFromEnv();
|
|
32
|
-
|
|
33
|
-
if (globalApiKey && globalApiEmail) {
|
|
34
|
-
return { authKey: globalApiKey, authEmail: globalApiEmail };
|
|
35
|
-
} else if (apiToken) {
|
|
36
|
-
return { apiToken };
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Try to read the account ID from the environment.
|
|
42
|
-
*/
|
|
43
|
-
export const getCloudflareAccountIdFromEnv = getEnvironmentVariableFactory({
|
|
44
|
-
variableName: "CLOUDFLARE_ACCOUNT_ID",
|
|
45
|
-
deprecatedName: "CF_ACCOUNT_ID",
|
|
46
|
-
});
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
interface GenerateAuthUrlProps {
|
|
2
|
-
authUrl: string;
|
|
3
|
-
clientId: string;
|
|
4
|
-
callbackUrl: string;
|
|
5
|
-
scopes: string[];
|
|
6
|
-
stateQueryParam: string;
|
|
7
|
-
codeChallenge: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* generateAuthUrl was extracted from getAuthURL in user.tsx
|
|
12
|
-
* to make it possible to mock the generated URL
|
|
13
|
-
*/
|
|
14
|
-
export const generateAuthUrl = ({
|
|
15
|
-
authUrl,
|
|
16
|
-
clientId,
|
|
17
|
-
callbackUrl,
|
|
18
|
-
scopes,
|
|
19
|
-
stateQueryParam,
|
|
20
|
-
codeChallenge,
|
|
21
|
-
}: GenerateAuthUrlProps) => {
|
|
22
|
-
return (
|
|
23
|
-
authUrl +
|
|
24
|
-
`?response_type=code&` +
|
|
25
|
-
`client_id=${encodeURIComponent(clientId)}&` +
|
|
26
|
-
`redirect_uri=${encodeURIComponent(callbackUrl)}&` +
|
|
27
|
-
// we add offline_access manually for every request
|
|
28
|
-
`scope=${encodeURIComponent([...scopes, "offline_access"].join(" "))}&` +
|
|
29
|
-
`state=${stateQueryParam}&` +
|
|
30
|
-
`code_challenge=${encodeURIComponent(codeChallenge)}&` +
|
|
31
|
-
`code_challenge_method=S256`
|
|
32
|
-
);
|
|
33
|
-
};
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { webcrypto as crypto } from "node:crypto";
|
|
2
|
-
import { PKCE_CHARSET } from "../user";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Generates random state to be passed for anti-csrf.
|
|
6
|
-
* extracted from user.tsx to make it possible to
|
|
7
|
-
* mock the generated URL
|
|
8
|
-
*/
|
|
9
|
-
export function generateRandomState(lengthOfState: number): string {
|
|
10
|
-
const output = new Uint32Array(lengthOfState);
|
|
11
|
-
// @ts-expect-error crypto's types aren't there yet
|
|
12
|
-
crypto.getRandomValues(output);
|
|
13
|
-
return Array.from(output)
|
|
14
|
-
.map((num: number) => PKCE_CHARSET[num % PKCE_CHARSET.length])
|
|
15
|
-
.join("");
|
|
16
|
-
}
|
package/src/user/index.ts
DELETED