wrangler 0.0.0-e178d6fb → 0.0.0-e1c2f5b9
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 +16 -2
- package/bin/wrangler.js +31 -11
- package/miniflare-dist/index.mjs +1340 -330
- package/package.json +40 -13
- package/src/__tests__/access.test.ts +25 -0
- package/src/__tests__/api-dev.test.ts +238 -0
- package/src/__tests__/api-devregistry.test.js +64 -0
- package/src/__tests__/api.test.ts +80 -0
- package/src/__tests__/configuration.test.ts +683 -470
- package/src/__tests__/d1.test.ts +123 -0
- package/src/__tests__/delete.test.ts +263 -0
- package/src/__tests__/deployments.test.ts +105 -0
- package/src/__tests__/dev.test.tsx +453 -70
- package/src/__tests__/dialogs.test.tsx +40 -0
- package/src/__tests__/generate.test.ts +235 -0
- package/src/__tests__/get-host-from-url.test.ts +16 -0
- package/src/__tests__/helpers/mock-auth-domain.ts +20 -0
- package/src/__tests__/helpers/mock-cfetch.ts +92 -26
- package/src/__tests__/helpers/mock-console.ts +11 -2
- package/src/__tests__/helpers/mock-dialogs.ts +1 -1
- package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -0
- package/src/__tests__/helpers/mock-known-routes.ts +7 -0
- package/src/__tests__/helpers/mock-kv.ts +1 -1
- package/src/__tests__/helpers/mock-oauth-flow.ts +74 -53
- package/src/__tests__/helpers/mock-process.ts +8 -13
- package/src/__tests__/helpers/msw/handlers/access.ts +13 -0
- package/src/__tests__/helpers/msw/handlers/deployments.ts +59 -0
- package/src/__tests__/helpers/msw/handlers/namespaces.ts +104 -0
- package/src/__tests__/helpers/msw/handlers/oauth.ts +31 -0
- package/src/__tests__/helpers/msw/handlers/r2.ts +80 -0
- package/src/__tests__/helpers/msw/handlers/script.ts +75 -0
- package/src/__tests__/helpers/msw/handlers/user.ts +63 -0
- package/src/__tests__/helpers/msw/handlers/zones.ts +22 -0
- package/src/__tests__/helpers/msw/index.ts +21 -0
- package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +1 -0
- package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +5 -0
- package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +1 -0
- package/src/__tests__/helpers/worker-scripts/parent-worker.js +8 -0
- package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +5 -0
- package/src/__tests__/index.test.ts +103 -97
- package/src/__tests__/init.test.ts +1484 -382
- package/src/__tests__/jest.setup.ts +88 -5
- package/src/__tests__/kv.test.ts +655 -540
- package/src/__tests__/logout.test.ts +47 -0
- package/src/__tests__/metrics.test.ts +95 -45
- package/src/__tests__/middleware.scheduled.test.ts +145 -0
- package/src/__tests__/middleware.test.ts +750 -0
- package/src/__tests__/pages-deployment-tail.test.ts +884 -0
- package/src/__tests__/pages.test.ts +1301 -119
- package/src/__tests__/paths.test.ts +39 -0
- package/src/__tests__/publish.test.ts +2266 -1180
- package/src/__tests__/pubsub.test.ts +211 -88
- package/src/__tests__/queues.test.ts +522 -0
- package/src/__tests__/r2.test.ts +363 -203
- package/src/__tests__/secret.test.ts +261 -59
- package/src/__tests__/tail.test.ts +352 -151
- package/src/__tests__/test-old-node-version.js +3 -3
- package/src/__tests__/tsconfig-sanity.ts +12 -0
- package/src/__tests__/tsconfig.json +8 -0
- package/src/__tests__/tsconfig.tsbuildinfo +1 -0
- package/src/__tests__/type-generation.test.ts +233 -0
- package/src/__tests__/user.test.ts +59 -73
- package/src/__tests__/utils-collectKeyValues.test.ts +47 -0
- package/src/__tests__/validate-dev-props.test.ts +56 -0
- package/src/__tests__/whoami.test.tsx +114 -66
- package/src/__tests__/worker-namespace.test.ts +154 -155
- package/src/api/dev.ts +170 -38
- package/src/api/index.ts +1 -0
- package/src/bundle-reporter.tsx +41 -2
- package/src/bundle.ts +668 -81
- package/src/cfetch/index.ts +40 -3
- package/src/cfetch/internal.ts +144 -32
- package/src/cli.ts +4 -3
- package/src/config/config.ts +27 -3
- package/src/config/environment.ts +131 -7
- package/src/config/index.ts +128 -8
- package/src/config/validation-helpers.ts +19 -6
- package/src/config/validation.ts +411 -14
- package/src/config-cache.ts +3 -2
- package/src/create-worker-preview.ts +31 -6
- package/src/create-worker-upload-form.ts +84 -22
- package/src/d1/backups.tsx +223 -0
- package/src/d1/constants.ts +2 -0
- package/src/d1/create.tsx +63 -0
- package/src/d1/delete.tsx +56 -0
- package/src/d1/execute.tsx +352 -0
- package/src/d1/formatTimeAgo.ts +14 -0
- package/src/d1/index.ts +101 -0
- package/src/d1/list.tsx +48 -0
- package/src/d1/migrations/apply.tsx +196 -0
- package/src/d1/migrations/create.tsx +77 -0
- package/src/d1/migrations/helpers.ts +147 -0
- package/src/d1/migrations/index.tsx +3 -0
- package/src/d1/migrations/list.tsx +79 -0
- package/src/d1/migrations/options.ts +18 -0
- package/src/d1/options.ts +22 -0
- package/src/d1/types.tsx +24 -0
- package/src/d1/utils.ts +48 -0
- package/src/delete.ts +108 -0
- package/src/deployments.ts +83 -0
- package/src/deprecated/index.ts +145 -0
- package/src/dev/dev-vars.ts +11 -8
- package/src/dev/dev.tsx +220 -58
- package/src/dev/get-local-persistence-path.tsx +31 -0
- package/src/dev/local.tsx +740 -181
- package/src/dev/remote.tsx +340 -123
- package/src/dev/start-server.ts +543 -0
- package/src/dev/use-esbuild.ts +61 -7
- package/src/dev/validate-dev-props.ts +31 -0
- package/src/dev-registry.tsx +201 -0
- package/src/dev.tsx +614 -258
- package/src/dialogs.tsx +41 -8
- package/src/{worker-namespace.ts → dispatch-namespace.ts} +23 -22
- package/src/docs/index.ts +97 -0
- package/src/entry.ts +3 -2
- package/src/environment-variables/factory.ts +88 -0
- package/src/environment-variables/misc-variables.ts +30 -0
- package/src/generate/index.ts +300 -0
- package/src/git-client.ts +100 -7
- package/src/index.tsx +249 -1560
- package/src/init.ts +626 -150
- package/src/inspect.ts +137 -32
- package/src/{metrics/is-ci.ts → is-ci.ts} +0 -0
- package/src/is-interactive.ts +4 -0
- package/src/jest.d.ts +4 -0
- package/src/{kv.ts → kv/helpers.ts} +3 -3
- package/src/kv/index.ts +596 -0
- package/src/logger.ts +27 -8
- package/src/metrics/index.ts +1 -0
- package/src/metrics/metrics-config.ts +4 -4
- package/src/metrics/metrics-dispatcher.ts +1 -0
- package/src/metrics/metrics-usage-headers.ts +24 -0
- package/src/metrics/send-event.ts +13 -8
- package/src/miniflare-cli/assets.ts +172 -465
- package/src/miniflare-cli/index.ts +149 -24
- package/src/miniflare-cli/tsconfig.json +9 -0
- package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
- package/src/miniflare-cli/types.ts +11 -0
- package/src/module-collection.ts +12 -3
- package/src/pages/build.tsx +108 -42
- package/src/pages/constants.ts +11 -0
- package/src/pages/deployment-tails.tsx +284 -0
- package/src/pages/deployments.tsx +9 -31
- package/src/pages/dev.tsx +417 -108
- package/src/pages/errors.ts +66 -0
- package/src/pages/functions/buildPlugin.ts +86 -84
- package/src/pages/functions/buildWorker.ts +121 -106
- package/src/pages/functions/routes-consolidation.test.ts +250 -0
- package/src/pages/functions/routes-consolidation.ts +73 -0
- package/src/pages/functions/routes-transformation.test.ts +282 -0
- package/src/pages/functions/routes-transformation.ts +115 -0
- package/src/pages/functions/routes-validation.test.ts +403 -0
- package/src/pages/functions/routes-validation.ts +202 -0
- package/src/pages/functions/tsconfig.json +8 -0
- package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
- package/src/pages/functions.tsx +82 -0
- package/src/pages/hash.tsx +13 -0
- package/src/pages/index.tsx +73 -55
- package/src/pages/projects.tsx +9 -3
- package/src/pages/prompt-select-project.tsx +31 -0
- package/src/pages/publish.tsx +183 -60
- package/src/pages/types.ts +1 -0
- package/src/pages/upload.tsx +107 -56
- package/src/pages/utils.ts +13 -2
- package/src/paths.ts +49 -4
- package/src/proxy.ts +375 -157
- package/src/publish/index.ts +270 -0
- package/src/{publish.ts → publish/publish.ts} +431 -188
- package/src/pubsub/pubsub-commands.tsx +4 -3
- package/src/queues/cli/commands/consumer/add.ts +71 -0
- package/src/queues/cli/commands/consumer/index.ts +22 -0
- package/src/queues/cli/commands/consumer/remove.ts +38 -0
- package/src/queues/cli/commands/create.ts +25 -0
- package/src/queues/cli/commands/delete.ts +26 -0
- package/src/queues/cli/commands/index.ts +36 -0
- package/src/queues/cli/commands/list.ts +25 -0
- package/src/queues/client.ts +135 -0
- package/src/queues/utils.ts +18 -0
- package/src/r2/constants.ts +4 -0
- package/src/r2/helpers.ts +131 -0
- package/src/r2/index.ts +289 -0
- package/src/routes.ts +140 -0
- package/src/secret/index.ts +379 -0
- package/src/sites.tsx +3 -3
- package/src/tail/createTail.ts +379 -0
- package/src/tail/filters.ts +4 -6
- package/src/tail/index.ts +199 -284
- package/src/tail/printing.ts +43 -3
- package/src/tsconfig-sanity.ts +16 -0
- package/src/type-generation.ts +181 -0
- package/src/user/access.ts +68 -0
- package/src/user/auth-variables.ts +113 -0
- package/src/user/choose-account.tsx +1 -1
- package/src/user/index.ts +0 -1
- package/src/user/user.tsx +116 -49
- package/src/utils/collectKeyValues.ts +14 -0
- package/src/whoami.tsx +80 -2
- package/src/worker.ts +69 -9
- package/src/yargs-types.ts +24 -0
- package/src/zones.ts +124 -9
- 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/__tests__/tsconfig.tsbuildinfo +1 -0
- package/templates/d1-beta-facade.js +205 -0
- package/templates/facade.d.ts +14 -0
- package/templates/first-party-worker-module-facade.ts +19 -0
- package/templates/format-dev-errors.ts +33 -0
- 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 +62 -0
- package/templates/middleware/loader-modules.ts +82 -0
- package/templates/middleware/loader-sw.ts +233 -0
- package/templates/middleware/middleware-miniflare3-json-error.ts +20 -0
- package/templates/middleware/middleware-pretty-error.ts +40 -0
- package/templates/middleware/middleware-scheduled.ts +15 -0
- package/templates/new-worker.js +1 -1
- package/templates/pages-dev-pipeline.ts +31 -0
- package/templates/pages-dev-util.ts +52 -0
- package/templates/pages-shim.ts +4 -1
- package/templates/pages-template-plugin.ts +21 -5
- package/templates/pages-template-worker.ts +37 -9
- package/templates/{static-asset-facade.js → serve-static-assets.ts} +23 -7
- package/templates/service-bindings-module-facade.js +54 -0
- package/templates/service-bindings-sw-facade.js +42 -0
- package/templates/tsconfig-sanity.ts +11 -0
- package/templates/tsconfig.init.json +106 -0
- package/templates/tsconfig.json +5 -102
- package/templates/tsconfig.tsbuildinfo +1 -0
- package/wrangler-dist/cli.d.ts +621 -42
- package/wrangler-dist/cli.js +144441 -102606
- package/src/environment-variables.ts +0 -35
- package/src/faye-websocket.d.ts +0 -6
- package/src/generate.ts +0 -33
- package/src/miniflare-cli/enum-keys.ts +0 -17
- package/src/preview.ts +0 -31
- package/src/r2.ts +0 -50
- package/src/user/env-vars.ts +0 -46
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { rest } from "msw";
|
|
4
|
+
import { getGlobalWranglerConfigPath } from "../global-wrangler-config-path";
|
|
5
|
+
import { USER_AUTH_CONFIG_FILE, writeAuthConfigFile } from "../user";
|
|
6
|
+
import { mockConsoleMethods } from "./helpers/mock-console";
|
|
7
|
+
import { msw } from "./helpers/msw";
|
|
8
|
+
import { runInTempDir } from "./helpers/run-in-tmp";
|
|
9
|
+
import { runWrangler } from "./helpers/run-wrangler";
|
|
10
|
+
|
|
11
|
+
describe("logout", () => {
|
|
12
|
+
runInTempDir();
|
|
13
|
+
const std = mockConsoleMethods();
|
|
14
|
+
|
|
15
|
+
it("should exit with a message stating the user is not logged in", async () => {
|
|
16
|
+
await runWrangler("logout");
|
|
17
|
+
expect(std.out).toMatchInlineSnapshot(`"Not logged in, exiting..."`);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("should logout user that has been properly logged in", async () => {
|
|
21
|
+
writeAuthConfigFile({
|
|
22
|
+
oauth_token: "some-oauth-tok",
|
|
23
|
+
refresh_token: "some-refresh-tok",
|
|
24
|
+
});
|
|
25
|
+
// Make sure that logout removed the config file containing the auth tokens.
|
|
26
|
+
const config = path.join(
|
|
27
|
+
getGlobalWranglerConfigPath(),
|
|
28
|
+
USER_AUTH_CONFIG_FILE
|
|
29
|
+
);
|
|
30
|
+
let counter = 0;
|
|
31
|
+
msw.use(
|
|
32
|
+
rest.post("*/oauth2/revoke", (_, response, context) => {
|
|
33
|
+
// Make sure that we made the request to logout.
|
|
34
|
+
counter += 1;
|
|
35
|
+
return response.once(context.status(200), context.text(""));
|
|
36
|
+
})
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
expect(fs.existsSync(config)).toBeTruthy();
|
|
40
|
+
|
|
41
|
+
await runWrangler("logout");
|
|
42
|
+
|
|
43
|
+
expect(std.out).toMatchInlineSnapshot(`"Successfully logged out."`);
|
|
44
|
+
expect(fs.existsSync(config)).toBeFalsy();
|
|
45
|
+
expect(counter).toBe(1);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { mkdirSync } from "node:fs";
|
|
2
|
-
import
|
|
2
|
+
import { rest } from "msw";
|
|
3
3
|
import { version as wranglerVersion } from "../../package.json";
|
|
4
4
|
import { purgeConfigCaches, saveToConfigCache } from "../config-cache";
|
|
5
|
+
import { CI } from "../is-ci";
|
|
5
6
|
import { logger } from "../logger";
|
|
6
7
|
import { getMetricsDispatcher, getMetricsConfig } from "../metrics";
|
|
7
|
-
import { CI } from "../metrics/is-ci";
|
|
8
8
|
import {
|
|
9
9
|
CURRENT_METRICS_DATE,
|
|
10
10
|
readMetricsConfig,
|
|
@@ -12,10 +12,10 @@ import {
|
|
|
12
12
|
writeMetricsConfig,
|
|
13
13
|
} from "../metrics/metrics-config";
|
|
14
14
|
import { writeAuthConfigFile } from "../user";
|
|
15
|
-
import { setMockResponse, unsetAllMocks } from "./helpers/mock-cfetch";
|
|
16
15
|
import { mockConsoleMethods } from "./helpers/mock-console";
|
|
17
16
|
import { mockConfirm } from "./helpers/mock-dialogs";
|
|
18
17
|
import { useMockIsTTY } from "./helpers/mock-istty";
|
|
18
|
+
import { msw, mswSuccessOauthHandlers } from "./helpers/msw";
|
|
19
19
|
import { runInTempDir } from "./helpers/run-in-tmp";
|
|
20
20
|
|
|
21
21
|
declare const global: { SPARROW_SOURCE_KEY: string | undefined };
|
|
@@ -26,6 +26,9 @@ describe("metrics", () => {
|
|
|
26
26
|
runInTempDir();
|
|
27
27
|
|
|
28
28
|
beforeEach(() => {
|
|
29
|
+
// Tell jest to use the original version of the `getMetricsConfig()` function in these tests.
|
|
30
|
+
const mockMetricsConfig = jest.requireMock("../metrics/metrics-config");
|
|
31
|
+
mockMetricsConfig.useOriginal = true;
|
|
29
32
|
global.SPARROW_SOURCE_KEY = "MOCK_KEY";
|
|
30
33
|
logger.loggerLevel = "debug";
|
|
31
34
|
// Create a node_modules directory to store config-cache files
|
|
@@ -33,8 +36,6 @@ describe("metrics", () => {
|
|
|
33
36
|
});
|
|
34
37
|
afterEach(() => {
|
|
35
38
|
global.SPARROW_SOURCE_KEY = ORIGINAL_SPARROW_SOURCE_KEY;
|
|
36
|
-
fetchMock.resetMocks();
|
|
37
|
-
unsetAllMocks();
|
|
38
39
|
purgeConfigCaches();
|
|
39
40
|
});
|
|
40
41
|
|
|
@@ -53,28 +54,24 @@ describe("metrics", () => {
|
|
|
53
54
|
|
|
54
55
|
describe("identify()", () => {
|
|
55
56
|
it("should send a request to the default URL", async () => {
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
await dispatcher.identify({ a: 1, b: 2 });
|
|
59
|
-
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
60
|
-
const [url, { body, headers }] = fetchMock.mock.calls[0];
|
|
61
|
-
expect(url).toEqual("https://sparrow.cloudflare.com/api/v1/identify");
|
|
62
|
-
expect(JSON.parse(body)).toEqual(
|
|
63
|
-
expect.objectContaining({
|
|
57
|
+
const request = mockMetricRequest(
|
|
58
|
+
{
|
|
64
59
|
event: "identify",
|
|
65
60
|
properties: {
|
|
66
61
|
category: "Workers",
|
|
67
62
|
wranglerVersion,
|
|
63
|
+
os: process.platform + ":" + process.arch,
|
|
68
64
|
a: 1,
|
|
69
65
|
b: 2,
|
|
70
66
|
},
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
expect.objectContaining({
|
|
75
|
-
"Sparrow-Source-Key": "MOCK_KEY",
|
|
76
|
-
})
|
|
67
|
+
},
|
|
68
|
+
{ "Sparrow-Source-Key": "MOCK_KEY" },
|
|
69
|
+
"identify"
|
|
77
70
|
);
|
|
71
|
+
const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
|
|
72
|
+
await dispatcher.identify({ a: 1, b: 2 });
|
|
73
|
+
|
|
74
|
+
expect(request.count).toBe(1);
|
|
78
75
|
expect(std.debug).toMatchInlineSnapshot(
|
|
79
76
|
`"Metrics dispatcher: Posting data {\\"type\\":\\"identify\\",\\"name\\":\\"identify\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}"`
|
|
80
77
|
);
|
|
@@ -84,12 +81,15 @@ describe("metrics", () => {
|
|
|
84
81
|
});
|
|
85
82
|
|
|
86
83
|
it("should write a debug log if the dispatcher is disabled", async () => {
|
|
84
|
+
const requests = mockMetricRequest({}, {}, "identify");
|
|
87
85
|
const dispatcher = await getMetricsDispatcher({
|
|
88
86
|
...MOCK_DISPATCHER_OPTIONS,
|
|
89
87
|
sendMetrics: false,
|
|
90
88
|
});
|
|
91
89
|
await dispatcher.identify({ a: 1, b: 2 });
|
|
92
|
-
|
|
90
|
+
await flushPromises();
|
|
91
|
+
|
|
92
|
+
expect(requests.count).toBe(0);
|
|
93
93
|
expect(std.debug).toMatchInlineSnapshot(
|
|
94
94
|
`"Metrics dispatcher: Dispatching disabled - would have sent {\\"type\\":\\"identify\\",\\"name\\":\\"identify\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}."`
|
|
95
95
|
);
|
|
@@ -99,12 +99,18 @@ describe("metrics", () => {
|
|
|
99
99
|
});
|
|
100
100
|
|
|
101
101
|
it("should write a debug log if the request fails", async () => {
|
|
102
|
+
msw.use(
|
|
103
|
+
rest.post("*/identify", async (req, res) => {
|
|
104
|
+
return res.networkError("BAD REQUEST");
|
|
105
|
+
})
|
|
106
|
+
);
|
|
107
|
+
|
|
102
108
|
const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
|
|
103
|
-
fetchMock.mockReject(new Error("BAD REQUEST"));
|
|
104
109
|
await dispatcher.identify({ a: 1, b: 2 });
|
|
110
|
+
await flushPromises();
|
|
105
111
|
expect(std.debug).toMatchInlineSnapshot(`
|
|
106
112
|
"Metrics dispatcher: Posting data {\\"type\\":\\"identify\\",\\"name\\":\\"identify\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}
|
|
107
|
-
Metrics dispatcher: Failed to send request: BAD REQUEST"
|
|
113
|
+
Metrics dispatcher: Failed to send request: request to https://sparrow.cloudflare.com/api/v1/identify failed, reason: BAD REQUEST"
|
|
108
114
|
`);
|
|
109
115
|
expect(std.out).toMatchInlineSnapshot(`""`);
|
|
110
116
|
expect(std.warn).toMatchInlineSnapshot(`""`);
|
|
@@ -115,7 +121,6 @@ describe("metrics", () => {
|
|
|
115
121
|
global.SPARROW_SOURCE_KEY = undefined;
|
|
116
122
|
const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
|
|
117
123
|
await dispatcher.identify({ a: 1, b: 2 });
|
|
118
|
-
expect(fetchMock).toHaveBeenCalledTimes(0);
|
|
119
124
|
expect(std.debug).toMatchInlineSnapshot(
|
|
120
125
|
`"Metrics dispatcher: Source Key not provided. Be sure to initialize before sending events. { type: 'identify', name: 'identify', properties: { a: 1, b: 2 } }"`
|
|
121
126
|
);
|
|
@@ -127,28 +132,26 @@ describe("metrics", () => {
|
|
|
127
132
|
|
|
128
133
|
describe("sendEvent()", () => {
|
|
129
134
|
it("should send a request to the default URL", async () => {
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
|
|
133
|
-
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
134
|
-
const [url, { body, headers }] = fetchMock.mock.calls[0];
|
|
135
|
-
expect(url).toEqual("https://sparrow.cloudflare.com/api/v1/event");
|
|
136
|
-
expect(JSON.parse(body)).toEqual(
|
|
137
|
-
expect.objectContaining({
|
|
135
|
+
const requests = mockMetricRequest(
|
|
136
|
+
{
|
|
138
137
|
event: "some-event",
|
|
139
138
|
properties: {
|
|
140
139
|
category: "Workers",
|
|
141
140
|
wranglerVersion,
|
|
141
|
+
os: process.platform + ":" + process.arch,
|
|
142
142
|
a: 1,
|
|
143
143
|
b: 2,
|
|
144
144
|
},
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
expect(headers).toEqual(
|
|
148
|
-
expect.objectContaining({
|
|
145
|
+
},
|
|
146
|
+
{
|
|
149
147
|
"Sparrow-Source-Key": "MOCK_KEY",
|
|
150
|
-
}
|
|
148
|
+
},
|
|
149
|
+
"event"
|
|
151
150
|
);
|
|
151
|
+
const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
|
|
152
|
+
await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
|
|
153
|
+
|
|
154
|
+
expect(requests.count).toBe(1);
|
|
152
155
|
expect(std.debug).toMatchInlineSnapshot(
|
|
153
156
|
`"Metrics dispatcher: Posting data {\\"type\\":\\"event\\",\\"name\\":\\"some-event\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}"`
|
|
154
157
|
);
|
|
@@ -158,12 +161,16 @@ describe("metrics", () => {
|
|
|
158
161
|
});
|
|
159
162
|
|
|
160
163
|
it("should write a debug log if the dispatcher is disabled", async () => {
|
|
164
|
+
const requests = mockMetricRequest({}, {}, "event");
|
|
165
|
+
|
|
161
166
|
const dispatcher = await getMetricsDispatcher({
|
|
162
167
|
...MOCK_DISPATCHER_OPTIONS,
|
|
163
168
|
sendMetrics: false,
|
|
164
169
|
});
|
|
165
170
|
await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
|
|
166
|
-
|
|
171
|
+
await flushPromises();
|
|
172
|
+
|
|
173
|
+
expect(requests.count).toBe(0);
|
|
167
174
|
expect(std.debug).toMatchInlineSnapshot(
|
|
168
175
|
`"Metrics dispatcher: Dispatching disabled - would have sent {\\"type\\":\\"event\\",\\"name\\":\\"some-event\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}."`
|
|
169
176
|
);
|
|
@@ -173,12 +180,17 @@ describe("metrics", () => {
|
|
|
173
180
|
});
|
|
174
181
|
|
|
175
182
|
it("should write a debug log if the request fails", async () => {
|
|
183
|
+
msw.use(
|
|
184
|
+
rest.post("*/event", async (_, res) => {
|
|
185
|
+
return res.networkError("BAD REQUEST");
|
|
186
|
+
})
|
|
187
|
+
);
|
|
176
188
|
const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
|
|
177
|
-
fetchMock.mockReject(new Error("BAD REQUEST"));
|
|
178
189
|
await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
|
|
190
|
+
await flushPromises();
|
|
179
191
|
expect(std.debug).toMatchInlineSnapshot(`
|
|
180
192
|
"Metrics dispatcher: Posting data {\\"type\\":\\"event\\",\\"name\\":\\"some-event\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}
|
|
181
|
-
Metrics dispatcher: Failed to send request: BAD REQUEST"
|
|
193
|
+
Metrics dispatcher: Failed to send request: request to https://sparrow.cloudflare.com/api/v1/event failed, reason: BAD REQUEST"
|
|
182
194
|
`);
|
|
183
195
|
expect(std.out).toMatchInlineSnapshot(`""`);
|
|
184
196
|
expect(std.warn).toMatchInlineSnapshot(`""`);
|
|
@@ -187,9 +199,11 @@ describe("metrics", () => {
|
|
|
187
199
|
|
|
188
200
|
it("should write a warning log if no source key has been provided", async () => {
|
|
189
201
|
global.SPARROW_SOURCE_KEY = undefined;
|
|
202
|
+
const requests = mockMetricRequest({}, {}, "event");
|
|
190
203
|
const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
|
|
191
204
|
await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
|
|
192
|
-
|
|
205
|
+
|
|
206
|
+
expect(requests.count).toBe(0);
|
|
193
207
|
expect(std.debug).toMatchInlineSnapshot(
|
|
194
208
|
`"Metrics dispatcher: Source Key not provided. Be sure to initialize before sending events. { type: 'event', name: 'some-event', properties: { a: 1, b: 2 } }"`
|
|
195
209
|
);
|
|
@@ -359,7 +373,7 @@ describe("metrics", () => {
|
|
|
359
373
|
|
|
360
374
|
expect(std.out).toMatchInlineSnapshot(`
|
|
361
375
|
"Usage metrics tracking has changed since you last granted permission.
|
|
362
|
-
Your choice has been saved in the following file:
|
|
376
|
+
Your choice has been saved in the following file: test-xdg-config/metrics.json.
|
|
363
377
|
|
|
364
378
|
You can override the user level setting for a project in \`wrangler.toml\`:
|
|
365
379
|
|
|
@@ -413,6 +427,8 @@ describe("metrics", () => {
|
|
|
413
427
|
sendMetrics: true,
|
|
414
428
|
offline: false,
|
|
415
429
|
});
|
|
430
|
+
await flushPromises();
|
|
431
|
+
|
|
416
432
|
expect(userId).toEqual("MOCK_USER_ID");
|
|
417
433
|
expect(userRequests.count).toBe(1);
|
|
418
434
|
});
|
|
@@ -433,13 +449,47 @@ describe("metrics", () => {
|
|
|
433
449
|
function mockUserRequest() {
|
|
434
450
|
const requests = { count: 0 };
|
|
435
451
|
beforeEach(() => {
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
452
|
+
msw.use(
|
|
453
|
+
...mswSuccessOauthHandlers,
|
|
454
|
+
rest.get("*/user", (_, res, cxt) => {
|
|
455
|
+
requests.count++;
|
|
456
|
+
return res(
|
|
457
|
+
cxt.status(200),
|
|
458
|
+
cxt.json({
|
|
459
|
+
success: true,
|
|
460
|
+
errors: [],
|
|
461
|
+
messages: [],
|
|
462
|
+
result: { id: "MOCK_USER_ID" },
|
|
463
|
+
})
|
|
464
|
+
);
|
|
465
|
+
})
|
|
466
|
+
);
|
|
440
467
|
});
|
|
441
468
|
afterEach(() => {
|
|
442
469
|
requests.count = 0;
|
|
443
470
|
});
|
|
444
471
|
return requests;
|
|
445
472
|
}
|
|
473
|
+
|
|
474
|
+
function mockMetricRequest(
|
|
475
|
+
body: unknown,
|
|
476
|
+
header: unknown,
|
|
477
|
+
endpoint: "identify" | "event"
|
|
478
|
+
) {
|
|
479
|
+
const requests = { count: 0 };
|
|
480
|
+
msw.use(
|
|
481
|
+
rest.post(`*/${endpoint}`, async (req, res, cxt) => {
|
|
482
|
+
requests.count++;
|
|
483
|
+
expect(await req.json()).toEqual(body);
|
|
484
|
+
expect(req.headers).toContain(header);
|
|
485
|
+
return res.once(cxt.status(200), cxt.json({}));
|
|
486
|
+
})
|
|
487
|
+
);
|
|
488
|
+
|
|
489
|
+
return requests;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// Forces a tick to allow the non-awaited fetch promise to resolve.
|
|
493
|
+
function flushPromises(): Promise<void> {
|
|
494
|
+
return new Promise((resolve) => setTimeout(resolve, 0));
|
|
495
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import { unstable_dev } from "../api";
|
|
3
|
+
import { runInTempDir } from "./helpers/run-in-tmp";
|
|
4
|
+
|
|
5
|
+
jest.unmock("undici");
|
|
6
|
+
|
|
7
|
+
describe("run scheduled events with middleware", () => {
|
|
8
|
+
describe("module workers", () => {
|
|
9
|
+
runInTempDir();
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
const scriptContent = `
|
|
13
|
+
export default {
|
|
14
|
+
fetch(request, env, ctx) {
|
|
15
|
+
const url = new URL(request.url);
|
|
16
|
+
if (url.pathname === "/__scheduled") {
|
|
17
|
+
return new Response("Fetch triggered at /__scheduled");
|
|
18
|
+
}
|
|
19
|
+
return new Response("Hello world!");
|
|
20
|
+
},
|
|
21
|
+
scheduled(controller, env, ctx) {
|
|
22
|
+
console.log("Doing something scheduled in modules...");
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
`;
|
|
26
|
+
fs.writeFileSync("index.js", scriptContent);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("should not intercept when middleware is not enabled", async () => {
|
|
30
|
+
const worker = await unstable_dev("index.js", {
|
|
31
|
+
experimental: {
|
|
32
|
+
disableExperimentalWarning: true,
|
|
33
|
+
disableDevRegistry: true,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const resp = await worker.fetch("/__scheduled");
|
|
38
|
+
let text;
|
|
39
|
+
if (resp) text = await resp.text();
|
|
40
|
+
expect(text).toMatchInlineSnapshot(`"Fetch triggered at /__scheduled"`);
|
|
41
|
+
await worker.stop();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("should intercept when middleware is enabled", async () => {
|
|
45
|
+
const worker = await unstable_dev("index.js", {
|
|
46
|
+
testScheduled: true,
|
|
47
|
+
experimental: {
|
|
48
|
+
disableExperimentalWarning: true,
|
|
49
|
+
disableDevRegistry: true,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const resp = await worker.fetch("/__scheduled");
|
|
54
|
+
let text;
|
|
55
|
+
if (resp) text = await resp.text();
|
|
56
|
+
expect(text).toMatchInlineSnapshot(`"Ran scheduled event"`);
|
|
57
|
+
await worker.stop();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("should not trigger scheduled event on wrong route", async () => {
|
|
61
|
+
const worker = await unstable_dev("index.js", {
|
|
62
|
+
testScheduled: true,
|
|
63
|
+
experimental: {
|
|
64
|
+
disableExperimentalWarning: true,
|
|
65
|
+
disableDevRegistry: true,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const resp = await worker.fetch("/test");
|
|
70
|
+
let text;
|
|
71
|
+
if (resp) text = await resp.text();
|
|
72
|
+
expect(text).toMatchInlineSnapshot(`"Hello world!"`);
|
|
73
|
+
await worker.stop();
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe("service workers", () => {
|
|
78
|
+
runInTempDir();
|
|
79
|
+
|
|
80
|
+
beforeEach(() => {
|
|
81
|
+
const scriptContent = `
|
|
82
|
+
addEventListener("scheduled", (event) => {
|
|
83
|
+
console.log("Doing something scheduled in service worker...");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
addEventListener("fetch", (event) => {
|
|
87
|
+
const url = new URL(event.request.url);
|
|
88
|
+
if (url.pathname === "/__scheduled") {
|
|
89
|
+
event.respondWith(new Response("Fetch triggered at /__scheduled"));
|
|
90
|
+
} else {
|
|
91
|
+
event.respondWith(new Response("Hello world!"));
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
`;
|
|
95
|
+
fs.writeFileSync("index.js", scriptContent);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("should not intercept when middleware is not enabled", async () => {
|
|
99
|
+
const worker = await unstable_dev("index.js", {
|
|
100
|
+
experimental: {
|
|
101
|
+
disableExperimentalWarning: true,
|
|
102
|
+
disableDevRegistry: true,
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const resp = await worker.fetch("/__scheduled");
|
|
107
|
+
let text;
|
|
108
|
+
if (resp) text = await resp.text();
|
|
109
|
+
expect(text).toMatchInlineSnapshot(`"Fetch triggered at /__scheduled"`);
|
|
110
|
+
await worker.stop();
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("should intercept when middleware is enabled", async () => {
|
|
114
|
+
const worker = await unstable_dev("index.js", {
|
|
115
|
+
testScheduled: true,
|
|
116
|
+
experimental: {
|
|
117
|
+
disableExperimentalWarning: true,
|
|
118
|
+
disableDevRegistry: true,
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const resp = await worker.fetch("/__scheduled");
|
|
123
|
+
let text;
|
|
124
|
+
if (resp) text = await resp.text();
|
|
125
|
+
expect(text).toMatchInlineSnapshot(`"Ran scheduled event"`);
|
|
126
|
+
await worker.stop();
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it("should not trigger scheduled event on wrong route", async () => {
|
|
130
|
+
const worker = await unstable_dev("index.js", {
|
|
131
|
+
testScheduled: true,
|
|
132
|
+
experimental: {
|
|
133
|
+
disableExperimentalWarning: true,
|
|
134
|
+
disableDevRegistry: true,
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const resp = await worker.fetch("/test");
|
|
139
|
+
let text;
|
|
140
|
+
if (resp) text = await resp.text();
|
|
141
|
+
expect(text).toMatchInlineSnapshot(`"Hello world!"`);
|
|
142
|
+
await worker.stop();
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|