@faststats/web 0.2.14 → 0.3.1
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/dist/chunks/api-urls-nKmJnyjD.js +1 -0
- package/dist/chunks/identifiers-DrjjHcKB.js +1 -0
- package/dist/chunks/{replay-DvJYurEC.d.ts → replay-DR_T0Iz4.d.ts} +12 -17
- package/dist/chunks/send-data-Cb4xlYF0.js +1 -0
- package/dist/error.d.ts +4 -12
- package/dist/error.js +2 -1
- package/dist/feature-flags.d.ts +19 -2
- package/dist/feature-flags.js +1 -1
- package/dist/index.d.ts +28 -59
- package/dist/index.js +1 -1
- package/dist/replay.d.ts +2 -2
- package/dist/replay.js +1 -1
- package/dist/web-vitals.d.ts +5 -8
- package/dist/web-vitals.js +1 -1
- package/package.json +7 -6
- package/CHANGELOG.md +0 -184
- package/REPLAY_PAYLOAD.md +0 -64
- package/dist/chunks/api-urls-DaeYkG0_.js +0 -1
- package/dist/chunks/error-Cd9PTS5v.js +0 -2
- package/dist/chunks/feature-flags-BClx56v5.d.ts +0 -19
- package/dist/chunks/feature-flags-DSOCIZHK.js +0 -1
- package/dist/chunks/replay-rTqcjOo2.js +0 -1
- package/dist/chunks/rolldown-runtime-MP-BAFHD.js +0 -1
- package/dist/chunks/send-data-B2fYGj6v.js +0 -1
- package/dist/chunks/session-manager-Cy63ptPF.js +0 -1
- package/dist/chunks/types-CYzR5xtT.js +0 -1
- package/dist/chunks/web-vitals-Be-Cg4Po.js +0 -1
- package/scripts/check-bundle-size.mjs +0 -96
- package/src/analytics.ts +0 -787
- package/src/entries/error.ts +0 -6
- package/src/entries/feature-flags.ts +0 -5
- package/src/entries/main.ts +0 -21
- package/src/entries/replay.ts +0 -1
- package/src/entries/web-vitals.ts +0 -1
- package/src/env.d.ts +0 -2
- package/src/error.ts +0 -257
- package/src/feature-flags.ts +0 -84
- package/src/replay.ts +0 -596
- package/src/sdk.ts +0 -8
- package/src/utils/api-urls.ts +0 -24
- package/src/utils/identifiers.ts +0 -47
- package/src/utils/send-data.ts +0 -52
- package/src/utils/session-manager.ts +0 -416
- package/src/utils/types.ts +0 -15
- package/src/web-vitals.ts +0 -159
- package/tests/analytics.test.ts +0 -453
- package/tests/identifiers.test.ts +0 -78
- package/tests/replay.test.ts +0 -582
- package/tests/session-manager.test.ts +0 -161
- package/tests/web-vitals.test.ts +0 -208
- package/tsconfig.json +0 -30
- package/tsdown.config.ts +0 -27
- package/worker/index.ts +0 -22
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
2
|
-
import {
|
|
3
|
-
createId,
|
|
4
|
-
getOrCreateSessionId,
|
|
5
|
-
getSessionContext,
|
|
6
|
-
getSessionStart,
|
|
7
|
-
onSessionRotated,
|
|
8
|
-
resetSession,
|
|
9
|
-
setCookielessMode,
|
|
10
|
-
setDefaultSiteKey,
|
|
11
|
-
touchActivity,
|
|
12
|
-
} from "../src/utils/session-manager";
|
|
13
|
-
|
|
14
|
-
class MockStorage {
|
|
15
|
-
private readonly data = new Map<string, string>();
|
|
16
|
-
|
|
17
|
-
getItem(key: string): string | null {
|
|
18
|
-
return this.data.get(key) ?? null;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
setItem(key: string, value: string): void {
|
|
22
|
-
this.data.set(key, value);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
removeItem(key: string): void {
|
|
26
|
-
this.data.delete(key);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function setGlobal(name: keyof typeof globalThis, value: unknown): void {
|
|
31
|
-
Object.defineProperty(globalThis, name, {
|
|
32
|
-
configurable: true,
|
|
33
|
-
writable: true,
|
|
34
|
-
value,
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const original = {
|
|
39
|
-
localStorage: globalThis.localStorage,
|
|
40
|
-
sessionStorage: globalThis.sessionStorage,
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
beforeEach(() => {
|
|
44
|
-
setGlobal("localStorage", new MockStorage());
|
|
45
|
-
setGlobal("sessionStorage", new MockStorage());
|
|
46
|
-
setCookielessMode(true);
|
|
47
|
-
setCookielessMode(false);
|
|
48
|
-
setDefaultSiteKey("site_test");
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
afterEach(() => {
|
|
52
|
-
setGlobal("localStorage", original.localStorage);
|
|
53
|
-
setGlobal("sessionStorage", original.sessionStorage);
|
|
54
|
-
setCookielessMode(false);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
describe("session-manager", () => {
|
|
58
|
-
test("rotates session after idle timeout", () => {
|
|
59
|
-
const local = globalThis.localStorage as unknown as MockStorage;
|
|
60
|
-
const idleMs = 30 * 60 * 1000 + 1;
|
|
61
|
-
local.setItem("faststats_session_id", "old-session");
|
|
62
|
-
local.setItem(
|
|
63
|
-
"faststats_session_activity",
|
|
64
|
-
(Date.now() - idleMs).toString(),
|
|
65
|
-
);
|
|
66
|
-
local.setItem("faststats_session_start", (Date.now() - idleMs).toString());
|
|
67
|
-
|
|
68
|
-
const rotations: Array<{ prev: string; next: string }> = [];
|
|
69
|
-
const unsubscribe = onSessionRotated((prev, next) => {
|
|
70
|
-
rotations.push({ prev: prev.sessionId, next: next.sessionId });
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
const next = getSessionContext("site_test");
|
|
74
|
-
unsubscribe();
|
|
75
|
-
expect(next.sessionId).not.toBe("old-session");
|
|
76
|
-
expect(rotations).toHaveLength(1);
|
|
77
|
-
expect(rotations[0]?.prev).toBe("old-session");
|
|
78
|
-
expect(rotations[0]?.next).toBe(next.sessionId);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
test("resetSession notifies rotation listeners", () => {
|
|
82
|
-
const first = getSessionContext("site_test");
|
|
83
|
-
const rotations: Array<{ prev: string; next: string }> = [];
|
|
84
|
-
const unsubscribe = onSessionRotated((prev, next) => {
|
|
85
|
-
rotations.push({ prev: prev.sessionId, next: next.sessionId });
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
const second = resetSession("site_test");
|
|
89
|
-
unsubscribe();
|
|
90
|
-
expect(second.sessionId).not.toBe(first.sessionId);
|
|
91
|
-
expect(rotations).toHaveLength(1);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
test("touchActivity extends session without rotating", () => {
|
|
95
|
-
const first = getSessionContext("site_test");
|
|
96
|
-
touchActivity();
|
|
97
|
-
const second = getSessionContext("site_test");
|
|
98
|
-
expect(second.sessionId).toBe(first.sessionId);
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
test("session id is recreated when activity timestamp is invalid", () => {
|
|
102
|
-
const local = globalThis.localStorage as unknown as MockStorage;
|
|
103
|
-
local.setItem("faststats_session_id", "old-session");
|
|
104
|
-
local.setItem("faststats_session_activity", "NaN");
|
|
105
|
-
const id = getOrCreateSessionId();
|
|
106
|
-
expect(id).not.toBe("old-session");
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
test("session start falls back when stored value is invalid", () => {
|
|
110
|
-
const local = globalThis.localStorage as unknown as MockStorage;
|
|
111
|
-
const now = Date.now();
|
|
112
|
-
local.setItem("faststats_session_id", "session-1");
|
|
113
|
-
local.setItem("faststats_session_activity", now.toString());
|
|
114
|
-
local.setItem("faststats_session_start", "NaN");
|
|
115
|
-
expect(getSessionStart()).toBe(now);
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
test("session id is shared across tabs via localStorage", () => {
|
|
119
|
-
const first = getOrCreateSessionId();
|
|
120
|
-
setGlobal("sessionStorage", new MockStorage());
|
|
121
|
-
const second = getOrCreateSessionId();
|
|
122
|
-
expect(second).toBe(first);
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
test("migrates legacy sessionStorage keys into localStorage", () => {
|
|
126
|
-
const session = globalThis.sessionStorage as unknown as MockStorage;
|
|
127
|
-
session.setItem("session_id", "legacy-session");
|
|
128
|
-
session.setItem("session_timestamp", Date.now().toString());
|
|
129
|
-
const id = getOrCreateSessionId();
|
|
130
|
-
expect(id).toBe("legacy-session");
|
|
131
|
-
const local = globalThis.localStorage as unknown as MockStorage;
|
|
132
|
-
expect(local.getItem("faststats_session_id")).toBe("legacy-session");
|
|
133
|
-
expect(session.getItem("session_id")).toBeNull();
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
test("createId generates unique values", () => {
|
|
137
|
-
expect(createId()).not.toBe(createId());
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
test("falls back to ephemeral session when storage access fails", () => {
|
|
141
|
-
Object.defineProperty(globalThis, "localStorage", {
|
|
142
|
-
configurable: true,
|
|
143
|
-
get() {
|
|
144
|
-
throw new Error("storage blocked");
|
|
145
|
-
},
|
|
146
|
-
});
|
|
147
|
-
Object.defineProperty(globalThis, "sessionStorage", {
|
|
148
|
-
configurable: true,
|
|
149
|
-
get() {
|
|
150
|
-
throw new Error("storage blocked");
|
|
151
|
-
},
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
const first = getSessionContext("site_test");
|
|
155
|
-
const second = getSessionContext("site_test");
|
|
156
|
-
|
|
157
|
-
expect(first.sessionId).toBeTruthy();
|
|
158
|
-
expect(second.sessionId).toBe(first.sessionId);
|
|
159
|
-
expect(second.windowId).toBe(first.sessionId);
|
|
160
|
-
});
|
|
161
|
-
});
|
package/tests/web-vitals.test.ts
DELETED
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
2
|
-
import WebVitalsTracker from "../src/web-vitals";
|
|
3
|
-
|
|
4
|
-
type FetchCall = {
|
|
5
|
-
url: string;
|
|
6
|
-
body?: string;
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
type Harness = {
|
|
10
|
-
fetchCalls: FetchCall[];
|
|
11
|
-
fetchStatuses: number[];
|
|
12
|
-
restore(): void;
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
function setGlobal(name: keyof typeof globalThis, value: unknown): void {
|
|
16
|
-
Object.defineProperty(globalThis, name, {
|
|
17
|
-
configurable: true,
|
|
18
|
-
writable: true,
|
|
19
|
-
value,
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function setupBrowser(): Harness {
|
|
24
|
-
const originalValues = {
|
|
25
|
-
window: globalThis.window,
|
|
26
|
-
document: globalThis.document,
|
|
27
|
-
location: globalThis.location,
|
|
28
|
-
fetch: globalThis.fetch,
|
|
29
|
-
sessionStorage: globalThis.sessionStorage,
|
|
30
|
-
};
|
|
31
|
-
const fetchCalls: FetchCall[] = [];
|
|
32
|
-
const fetchStatuses: number[] = [];
|
|
33
|
-
const listeners = new Map<string, Set<EventListenerOrEventListenerObject>>();
|
|
34
|
-
const addEventListener = (
|
|
35
|
-
type: string,
|
|
36
|
-
listener: EventListenerOrEventListenerObject,
|
|
37
|
-
): void => {
|
|
38
|
-
const existing = listeners.get(type) ?? new Set();
|
|
39
|
-
existing.add(listener);
|
|
40
|
-
listeners.set(type, existing);
|
|
41
|
-
};
|
|
42
|
-
const removeEventListener = (
|
|
43
|
-
type: string,
|
|
44
|
-
listener: EventListenerOrEventListenerObject,
|
|
45
|
-
): void => {
|
|
46
|
-
listeners.get(type)?.delete(listener);
|
|
47
|
-
};
|
|
48
|
-
const location = {
|
|
49
|
-
href: "https://example.com/",
|
|
50
|
-
};
|
|
51
|
-
const storage = new Map<string, string>();
|
|
52
|
-
const sessionStorage = {
|
|
53
|
-
getItem: (key: string) => storage.get(key) ?? null,
|
|
54
|
-
setItem: (key: string, value: string) => storage.set(key, value),
|
|
55
|
-
removeItem: (key: string) => storage.delete(key),
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
setGlobal("location", location as Location);
|
|
59
|
-
setGlobal("document", {
|
|
60
|
-
addEventListener,
|
|
61
|
-
removeEventListener,
|
|
62
|
-
visibilityState: "visible",
|
|
63
|
-
} as unknown as Document);
|
|
64
|
-
setGlobal("window", {
|
|
65
|
-
addEventListener,
|
|
66
|
-
removeEventListener,
|
|
67
|
-
location,
|
|
68
|
-
setTimeout,
|
|
69
|
-
clearTimeout,
|
|
70
|
-
} as unknown as Window & typeof globalThis);
|
|
71
|
-
setGlobal("sessionStorage", sessionStorage);
|
|
72
|
-
setGlobal("fetch", (async (
|
|
73
|
-
url: string | URL | Request,
|
|
74
|
-
init?: RequestInit,
|
|
75
|
-
): Promise<Response> => {
|
|
76
|
-
fetchCalls.push({
|
|
77
|
-
url: String(url),
|
|
78
|
-
body: typeof init?.body === "string" ? init.body : undefined,
|
|
79
|
-
});
|
|
80
|
-
return new Response("", { status: fetchStatuses.shift() ?? 204 });
|
|
81
|
-
}) as typeof fetch);
|
|
82
|
-
|
|
83
|
-
return {
|
|
84
|
-
fetchCalls,
|
|
85
|
-
fetchStatuses,
|
|
86
|
-
restore() {
|
|
87
|
-
setGlobal("window", originalValues.window);
|
|
88
|
-
setGlobal("document", originalValues.document);
|
|
89
|
-
setGlobal("location", originalValues.location);
|
|
90
|
-
setGlobal("fetch", originalValues.fetch);
|
|
91
|
-
setGlobal("sessionStorage", originalValues.sessionStorage);
|
|
92
|
-
},
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function captureMetric(
|
|
97
|
-
tracker: WebVitalsTracker,
|
|
98
|
-
metric: Parameters<(metric: unknown) => void>[0],
|
|
99
|
-
): void {
|
|
100
|
-
(
|
|
101
|
-
tracker as unknown as {
|
|
102
|
-
captureMetric(metric: unknown): void;
|
|
103
|
-
}
|
|
104
|
-
).captureMetric(metric);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
let harness: Harness;
|
|
108
|
-
|
|
109
|
-
beforeEach(() => {
|
|
110
|
-
harness = setupBrowser();
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
afterEach(() => {
|
|
114
|
-
harness.restore();
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
describe("WebVitalsTracker", () => {
|
|
118
|
-
test("flushes the current vitals bucket when the SPA route changes", async () => {
|
|
119
|
-
const tracker = new WebVitalsTracker({
|
|
120
|
-
siteKey: "site_test",
|
|
121
|
-
baseUrl: "https://analytics.example.com",
|
|
122
|
-
samplingPercentage: 100,
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
tracker.start();
|
|
126
|
-
captureMetric(tracker, {
|
|
127
|
-
name: "CLS",
|
|
128
|
-
value: 0.12,
|
|
129
|
-
id: "v1",
|
|
130
|
-
rating: "needs-improvement",
|
|
131
|
-
delta: 0.12,
|
|
132
|
-
navigationType: "navigate",
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
tracker.trackPageChange("https://example.com/about");
|
|
136
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
137
|
-
|
|
138
|
-
expect(harness.fetchCalls.length).toBe(1);
|
|
139
|
-
const firstPayload = JSON.parse(harness.fetchCalls[0]?.body ?? "{}") as {
|
|
140
|
-
metadata?: { url?: string };
|
|
141
|
-
vitals?: Array<{ metric?: string }>;
|
|
142
|
-
};
|
|
143
|
-
expect(firstPayload.metadata?.url).toBe("https://example.com/");
|
|
144
|
-
expect(firstPayload.vitals?.[0]?.metric).toBe("CLS");
|
|
145
|
-
|
|
146
|
-
captureMetric(tracker, {
|
|
147
|
-
name: "INP",
|
|
148
|
-
value: 32,
|
|
149
|
-
id: "v2",
|
|
150
|
-
rating: "good",
|
|
151
|
-
delta: 32,
|
|
152
|
-
navigationType: "navigate",
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
tracker.stop();
|
|
156
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
157
|
-
|
|
158
|
-
expect(harness.fetchCalls.length).toBe(2);
|
|
159
|
-
const secondPayload = JSON.parse(harness.fetchCalls[1]?.body ?? "{}") as {
|
|
160
|
-
metadata?: { url?: string };
|
|
161
|
-
vitals?: Array<{ metric?: string }>;
|
|
162
|
-
};
|
|
163
|
-
expect(secondPayload.metadata?.url).toBe("https://example.com/about");
|
|
164
|
-
expect(secondPayload.vitals?.[0]?.metric).toBe("INP");
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
test("keeps metrics buffered when a route flush fails", async () => {
|
|
168
|
-
harness.fetchStatuses.push(500, 204, 204);
|
|
169
|
-
const tracker = new WebVitalsTracker({
|
|
170
|
-
siteKey: "site_test",
|
|
171
|
-
baseUrl: "https://analytics.example.com",
|
|
172
|
-
samplingPercentage: 100,
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
tracker.start();
|
|
176
|
-
captureMetric(tracker, {
|
|
177
|
-
name: "CLS",
|
|
178
|
-
value: 0.12,
|
|
179
|
-
id: "v1",
|
|
180
|
-
rating: "needs-improvement",
|
|
181
|
-
delta: 0.12,
|
|
182
|
-
navigationType: "navigate",
|
|
183
|
-
});
|
|
184
|
-
tracker.trackPageChange("https://example.com/about");
|
|
185
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
186
|
-
|
|
187
|
-
expect(harness.fetchCalls.length).toBe(1);
|
|
188
|
-
|
|
189
|
-
captureMetric(tracker, {
|
|
190
|
-
name: "INP",
|
|
191
|
-
value: 32,
|
|
192
|
-
id: "v2",
|
|
193
|
-
rating: "good",
|
|
194
|
-
delta: 32,
|
|
195
|
-
navigationType: "navigate",
|
|
196
|
-
});
|
|
197
|
-
tracker.trackPageChange("https://example.com/contact");
|
|
198
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
199
|
-
|
|
200
|
-
expect(harness.fetchCalls.length).toBe(3);
|
|
201
|
-
const retriedPayload = JSON.parse(harness.fetchCalls[1]?.body ?? "{}") as {
|
|
202
|
-
metadata?: { url?: string };
|
|
203
|
-
vitals?: Array<{ metric?: string }>;
|
|
204
|
-
};
|
|
205
|
-
expect(retriedPayload.metadata?.url).toBe("https://example.com/");
|
|
206
|
-
expect(retriedPayload.vitals?.[0]?.metric).toBe("CLS");
|
|
207
|
-
});
|
|
208
|
-
});
|
package/tsconfig.json
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
// Environment setup & latest features
|
|
4
|
-
"lib": ["ESNext", "DOM"],
|
|
5
|
-
"target": "ESNext",
|
|
6
|
-
"module": "Preserve",
|
|
7
|
-
"moduleDetection": "force",
|
|
8
|
-
"jsx": "react-jsx",
|
|
9
|
-
"allowJs": true,
|
|
10
|
-
|
|
11
|
-
// Bundler mode
|
|
12
|
-
"moduleResolution": "bundler",
|
|
13
|
-
"allowImportingTsExtensions": true,
|
|
14
|
-
"verbatimModuleSyntax": true,
|
|
15
|
-
"noEmit": true,
|
|
16
|
-
|
|
17
|
-
// Best practices
|
|
18
|
-
"strict": true,
|
|
19
|
-
"skipLibCheck": true,
|
|
20
|
-
"noFallthroughCasesInSwitch": true,
|
|
21
|
-
"noUncheckedIndexedAccess": true,
|
|
22
|
-
"noImplicitOverride": true,
|
|
23
|
-
|
|
24
|
-
// Some stricter flags (disabled by default)
|
|
25
|
-
"noUnusedLocals": false,
|
|
26
|
-
"noUnusedParameters": false,
|
|
27
|
-
"noPropertyAccessFromIndexSignature": false
|
|
28
|
-
},
|
|
29
|
-
"include": ["src"]
|
|
30
|
-
}
|
package/tsdown.config.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from "tsdown";
|
|
2
|
-
import pkg from "./package.json" with { type: "json" };
|
|
3
|
-
|
|
4
|
-
export default defineConfig({
|
|
5
|
-
entry: {
|
|
6
|
-
index: "src/entries/main.ts",
|
|
7
|
-
"feature-flags": "src/entries/feature-flags.ts",
|
|
8
|
-
replay: "src/entries/replay.ts",
|
|
9
|
-
error: "src/entries/error.ts",
|
|
10
|
-
"web-vitals": "src/entries/web-vitals.ts",
|
|
11
|
-
},
|
|
12
|
-
format: ["esm"],
|
|
13
|
-
platform: "browser",
|
|
14
|
-
outDir: "dist",
|
|
15
|
-
dts: true,
|
|
16
|
-
minify: true,
|
|
17
|
-
deps: { onlyBundle: false },
|
|
18
|
-
checks: { pluginTimings: false },
|
|
19
|
-
define: {
|
|
20
|
-
__FASTSTATS_SDK_NAME__: JSON.stringify(pkg.name),
|
|
21
|
-
__FASTSTATS_SDK_VERSION__: JSON.stringify(pkg.version),
|
|
22
|
-
},
|
|
23
|
-
outputOptions: {
|
|
24
|
-
chunkFileNames: "chunks/[name]-[hash].js",
|
|
25
|
-
entryFileNames: "[name].js",
|
|
26
|
-
},
|
|
27
|
-
});
|
package/worker/index.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
async fetch(
|
|
3
|
-
request: Request,
|
|
4
|
-
env: { ASSETS: { fetch: typeof fetch } },
|
|
5
|
-
): Promise<Response> {
|
|
6
|
-
const response = await env.ASSETS.fetch(request);
|
|
7
|
-
|
|
8
|
-
if (response.ok) {
|
|
9
|
-
const newHeaders = new Headers(response.headers);
|
|
10
|
-
newHeaders.set("Cache-Control", "public, max-age=31536000, immutable");
|
|
11
|
-
newHeaders.set("Access-Control-Allow-Origin", "*");
|
|
12
|
-
|
|
13
|
-
return new Response(response.body, {
|
|
14
|
-
status: response.status,
|
|
15
|
-
statusText: response.statusText,
|
|
16
|
-
headers: newHeaders,
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return response;
|
|
21
|
-
},
|
|
22
|
-
};
|