@adonix.org/cloud-spark 0.0.61 → 0.0.63
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/index.d.ts +45 -74
- package/dist/index.js +93 -124
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { StatusCodes } from 'http-status-codes';
|
|
2
2
|
export { StatusCodes } from 'http-status-codes';
|
|
3
|
+
import CacheControl from 'cache-control-parser';
|
|
4
|
+
export { CacheControl } from 'cache-control-parser';
|
|
3
5
|
|
|
4
6
|
declare const Time: {
|
|
5
7
|
readonly Second: 1;
|
|
@@ -7,6 +9,7 @@ declare const Time: {
|
|
|
7
9
|
readonly Hour: number;
|
|
8
10
|
readonly Day: number;
|
|
9
11
|
readonly Week: number;
|
|
12
|
+
readonly Year: number;
|
|
10
13
|
};
|
|
11
14
|
declare enum Method {
|
|
12
15
|
GET = "GET",
|
|
@@ -67,38 +70,6 @@ declare enum MimeType {
|
|
|
67
70
|
declare function setHeader(headers: Headers, key: string, value: string | string[]): void;
|
|
68
71
|
declare function mergeHeader(headers: Headers, key: string, value: string | string[]): void;
|
|
69
72
|
|
|
70
|
-
type LogLevel = "debug" | "info" | "warn" | "error";
|
|
71
|
-
interface BaseLogEntry {
|
|
72
|
-
timestamp: string;
|
|
73
|
-
level: LogLevel;
|
|
74
|
-
message: string;
|
|
75
|
-
correlationId?: string;
|
|
76
|
-
}
|
|
77
|
-
interface ErrorLogEntry extends BaseLogEntry {
|
|
78
|
-
level: "error";
|
|
79
|
-
error?: string;
|
|
80
|
-
stack?: string;
|
|
81
|
-
}
|
|
82
|
-
type LogEntry = BaseLogEntry | ErrorLogEntry;
|
|
83
|
-
interface Logger {
|
|
84
|
-
log(level: LogLevel, message: string, correlationId?: string, err?: Error): void;
|
|
85
|
-
format(level: LogLevel, message: string): string;
|
|
86
|
-
flush(): Promise<void>;
|
|
87
|
-
debug(message: string, correlationId?: string): void;
|
|
88
|
-
info(message: string, correlationId?: string): void;
|
|
89
|
-
warn(message: string, correlationId?: string): void;
|
|
90
|
-
error(message: string, error?: unknown, correlationId?: string): void;
|
|
91
|
-
}
|
|
92
|
-
declare class ConsoleLogger implements Logger {
|
|
93
|
-
log(level: LogLevel, message: string, correlationId?: string, err?: unknown): void;
|
|
94
|
-
format(_level: LogLevel, message: string): string;
|
|
95
|
-
flush(): Promise<void>;
|
|
96
|
-
debug(message: string, correlationId?: string): void;
|
|
97
|
-
info(message: string, correlationId?: string): void;
|
|
98
|
-
warn(message: string, correlationId?: string): void;
|
|
99
|
-
error(message: string, err?: unknown, correlationId?: string): void;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
73
|
interface CorsProvider {
|
|
103
74
|
getOrigin(): string | null;
|
|
104
75
|
getAllowOrigins(): string[];
|
|
@@ -108,72 +79,74 @@ interface CorsProvider {
|
|
|
108
79
|
getMaxAge(): number;
|
|
109
80
|
}
|
|
110
81
|
interface ErrorJson {
|
|
111
|
-
|
|
82
|
+
status: number;
|
|
112
83
|
error: string;
|
|
113
84
|
details: string;
|
|
114
85
|
}
|
|
115
|
-
declare class BasicResponse {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
86
|
+
declare abstract class BasicResponse {
|
|
87
|
+
headers: Headers;
|
|
88
|
+
body: BodyInit | null;
|
|
89
|
+
status: StatusCodes;
|
|
90
|
+
statusText?: string;
|
|
91
|
+
mimeType?: MimeType;
|
|
92
|
+
cache?: CacheControl.CacheControl;
|
|
93
|
+
constructor(content?: BodyInit | null);
|
|
121
94
|
protected get responseInit(): ResponseInit;
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
constructor(cors: CorsProvider, content?: BodyInit | null, code?: StatusCodes, mimeType?: MimeType);
|
|
95
|
+
setHeader(key: string, value: string | string[]): void;
|
|
96
|
+
mergeHeader(key: string, value: string | string[]): void;
|
|
97
|
+
addContentHeader(): void;
|
|
98
|
+
addCacheHeader(): void;
|
|
99
|
+
}
|
|
100
|
+
declare abstract class CorsResponse extends BasicResponse {
|
|
101
|
+
readonly cors: CorsProvider;
|
|
102
|
+
constructor(cors: CorsProvider, content?: BodyInit | null);
|
|
131
103
|
protected addCorsHeaders(): void;
|
|
132
104
|
}
|
|
133
|
-
declare class WorkerResponse extends CorsResponse {
|
|
105
|
+
declare abstract class WorkerResponse extends CorsResponse {
|
|
106
|
+
constructor(cors: CorsProvider, body?: BodyInit | null, cache?: CacheControl.CacheControl);
|
|
134
107
|
createResponse(): Response;
|
|
135
108
|
}
|
|
136
109
|
declare class ClonedResponse extends WorkerResponse {
|
|
137
|
-
constructor(cors: CorsProvider, response: Response);
|
|
110
|
+
constructor(cors: CorsProvider, response: Response, cache?: CacheControl.CacheControl);
|
|
138
111
|
}
|
|
139
|
-
declare class
|
|
140
|
-
|
|
141
|
-
constructor(cors: CorsProvider, content?: object, code?: StatusCodes);
|
|
142
|
-
get json(): object;
|
|
143
|
-
set json(json: object);
|
|
144
|
-
protected get body(): string;
|
|
112
|
+
declare class SuccessResponse extends WorkerResponse {
|
|
113
|
+
constructor(cors: CorsProvider, body?: BodyInit | null, cache?: CacheControl.CacheControl, status?: StatusCodes);
|
|
145
114
|
}
|
|
146
|
-
declare class
|
|
147
|
-
constructor(cors: CorsProvider,
|
|
115
|
+
declare class JsonResponse extends SuccessResponse {
|
|
116
|
+
constructor(cors: CorsProvider, json?: object, cache?: CacheControl.CacheControl, status?: StatusCodes);
|
|
148
117
|
}
|
|
149
|
-
declare class
|
|
150
|
-
constructor(cors: CorsProvider,
|
|
118
|
+
declare class HtmlResponse extends SuccessResponse {
|
|
119
|
+
constructor(cors: CorsProvider, body: string, cache?: CacheControl.CacheControl, status?: StatusCodes);
|
|
120
|
+
}
|
|
121
|
+
declare class TextResponse extends SuccessResponse {
|
|
122
|
+
constructor(cors: CorsProvider, content: string, cache?: CacheControl.CacheControl, status?: StatusCodes);
|
|
151
123
|
}
|
|
152
124
|
/**
|
|
153
125
|
* Remove the body from a GET response.
|
|
154
126
|
*/
|
|
155
127
|
declare class Head extends WorkerResponse {
|
|
156
|
-
constructor(cors: CorsProvider,
|
|
128
|
+
constructor(cors: CorsProvider, get: Response);
|
|
157
129
|
}
|
|
158
|
-
declare class Options extends
|
|
130
|
+
declare class Options extends SuccessResponse {
|
|
159
131
|
constructor(cors: CorsProvider);
|
|
160
132
|
}
|
|
161
133
|
declare class HttpError extends JsonResponse {
|
|
162
|
-
protected details?: string | undefined;
|
|
163
|
-
constructor(cors: CorsProvider,
|
|
134
|
+
protected readonly details?: string | undefined;
|
|
135
|
+
constructor(cors: CorsProvider, status: StatusCodes, details?: string | undefined);
|
|
164
136
|
get json(): ErrorJson;
|
|
137
|
+
createResponse(): Response;
|
|
165
138
|
}
|
|
166
139
|
declare class BadRequest extends HttpError {
|
|
167
|
-
constructor(cors: CorsProvider,
|
|
140
|
+
constructor(cors: CorsProvider, details?: string);
|
|
168
141
|
}
|
|
169
142
|
declare class Unauthorized extends HttpError {
|
|
170
|
-
constructor(cors: CorsProvider,
|
|
143
|
+
constructor(cors: CorsProvider, details?: string);
|
|
171
144
|
}
|
|
172
145
|
declare class Forbidden extends HttpError {
|
|
173
|
-
constructor(cors: CorsProvider,
|
|
146
|
+
constructor(cors: CorsProvider, details?: string);
|
|
174
147
|
}
|
|
175
148
|
declare class NotFound extends HttpError {
|
|
176
|
-
constructor(cors: CorsProvider,
|
|
149
|
+
constructor(cors: CorsProvider, details?: string);
|
|
177
150
|
}
|
|
178
151
|
declare class MethodNotAllowed extends HttpError {
|
|
179
152
|
constructor(cors: CorsProvider, method: string);
|
|
@@ -182,25 +155,23 @@ declare class MethodNotAllowed extends HttpError {
|
|
|
182
155
|
};
|
|
183
156
|
}
|
|
184
157
|
declare class InternalServerError extends HttpError {
|
|
185
|
-
constructor(cors: CorsProvider,
|
|
158
|
+
constructor(cors: CorsProvider, details?: string);
|
|
186
159
|
}
|
|
187
160
|
declare class NotImplemented extends HttpError {
|
|
188
161
|
constructor(cors: CorsProvider);
|
|
189
162
|
}
|
|
190
163
|
declare class ServiceUnavailable extends HttpError {
|
|
191
|
-
constructor(cors: CorsProvider,
|
|
164
|
+
constructor(cors: CorsProvider, details?: string);
|
|
192
165
|
}
|
|
193
166
|
|
|
194
167
|
declare abstract class BasicWorker implements CorsProvider {
|
|
195
168
|
private readonly _request;
|
|
196
169
|
private readonly _env;
|
|
197
170
|
private readonly _ctx?;
|
|
198
|
-
|
|
199
|
-
constructor(_request: Request, _env?: Env, _ctx?: ExecutionContext | undefined, _logger?: Logger);
|
|
171
|
+
constructor(_request: Request, _env?: Env, _ctx?: ExecutionContext | undefined);
|
|
200
172
|
protected get request(): Request;
|
|
201
173
|
protected get env(): Env;
|
|
202
174
|
protected get ctx(): ExecutionContext | undefined;
|
|
203
|
-
protected get log(): Logger;
|
|
204
175
|
fetch(): Promise<Response>;
|
|
205
176
|
protected dispatch(request: Request): Promise<Response>;
|
|
206
177
|
protected get(): Promise<Response>;
|
|
@@ -245,4 +216,4 @@ declare abstract class RoutedWorker extends BasicWorker {
|
|
|
245
216
|
protected delete(): Promise<Response>;
|
|
246
217
|
}
|
|
247
218
|
|
|
248
|
-
export { BadRequest,
|
|
219
|
+
export { BadRequest, BasicWorker, ClonedResponse, type CorsProvider, type ErrorJson, Forbidden, Head, HtmlResponse, HttpError, InternalServerError, JsonResponse, Method, MethodNotAllowed, MimeType, NotFound, NotImplemented, Options, Route, type RouteCallback, type RouteInit, RoutedWorker, Routes, ServiceUnavailable, SuccessResponse, TextResponse, Time, Unauthorized, WorkerResponse, getContentType, isMethod, mergeHeader, setHeader };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import { StatusCodes as StatusCodes2 } from "http-status-codes";
|
|
3
|
+
import { CacheControl as CacheControl2 } from "cache-control-parser";
|
|
3
4
|
|
|
4
5
|
// src/common.ts
|
|
5
6
|
var Time = {
|
|
@@ -7,7 +8,8 @@ var Time = {
|
|
|
7
8
|
Minute: 60,
|
|
8
9
|
Hour: 60 * 60,
|
|
9
10
|
Day: 60 * 60 * 24,
|
|
10
|
-
Week: 60 * 60 * 24 * 7
|
|
11
|
+
Week: 60 * 60 * 24 * 7,
|
|
12
|
+
Year: 60 * 60 * 24 * 365
|
|
11
13
|
};
|
|
12
14
|
var Method = /* @__PURE__ */ ((Method3) => {
|
|
13
15
|
Method3["GET"] = "GET";
|
|
@@ -111,92 +113,46 @@ function mergeHeader(headers, key, value) {
|
|
|
111
113
|
}
|
|
112
114
|
}
|
|
113
115
|
|
|
114
|
-
// src/logging.ts
|
|
115
|
-
var ConsoleLogger = class {
|
|
116
|
-
log(level, message, correlationId, err) {
|
|
117
|
-
const error = err instanceof Error ? err.message : err ? String(err) : void 0;
|
|
118
|
-
const stack = err instanceof Error ? err.stack : void 0;
|
|
119
|
-
const entry = {
|
|
120
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
121
|
-
level,
|
|
122
|
-
message,
|
|
123
|
-
...error ? { error, stack } : {},
|
|
124
|
-
...correlationId ? { correlationId } : {}
|
|
125
|
-
};
|
|
126
|
-
switch (level) {
|
|
127
|
-
case "debug":
|
|
128
|
-
console.debug(entry);
|
|
129
|
-
break;
|
|
130
|
-
case "info":
|
|
131
|
-
console.info(entry);
|
|
132
|
-
break;
|
|
133
|
-
case "warn":
|
|
134
|
-
console.warn(entry);
|
|
135
|
-
break;
|
|
136
|
-
case "error":
|
|
137
|
-
console.error(entry);
|
|
138
|
-
break;
|
|
139
|
-
default:
|
|
140
|
-
console.log(entry);
|
|
141
|
-
break;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
format(_level, message) {
|
|
145
|
-
return message;
|
|
146
|
-
}
|
|
147
|
-
async flush() {
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
debug(message, correlationId) {
|
|
151
|
-
this.log("debug", message, correlationId);
|
|
152
|
-
}
|
|
153
|
-
info(message, correlationId) {
|
|
154
|
-
this.log("info", message, correlationId);
|
|
155
|
-
}
|
|
156
|
-
warn(message, correlationId) {
|
|
157
|
-
this.log("warn", message, correlationId);
|
|
158
|
-
}
|
|
159
|
-
error(message, err, correlationId) {
|
|
160
|
-
this.log("error", message, correlationId, err);
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
|
|
164
116
|
// src/response.ts
|
|
165
117
|
import { getReasonPhrase, StatusCodes } from "http-status-codes";
|
|
118
|
+
import CacheControl from "cache-control-parser";
|
|
166
119
|
var BasicResponse = class {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
120
|
+
headers = new Headers();
|
|
121
|
+
body;
|
|
122
|
+
status = StatusCodes.OK;
|
|
123
|
+
statusText;
|
|
124
|
+
mimeType;
|
|
125
|
+
cache;
|
|
126
|
+
constructor(content = null) {
|
|
127
|
+
this.body = this.status === StatusCodes.NO_CONTENT ? null : content;
|
|
171
128
|
}
|
|
172
|
-
_headers = new Headers();
|
|
173
|
-
_body;
|
|
174
129
|
get responseInit() {
|
|
175
130
|
return {
|
|
176
131
|
headers: this.headers,
|
|
177
|
-
status: this.
|
|
178
|
-
statusText: getReasonPhrase(this.
|
|
132
|
+
status: this.status,
|
|
133
|
+
statusText: this.statusText ?? getReasonPhrase(this.status)
|
|
179
134
|
};
|
|
180
135
|
}
|
|
181
|
-
get body() {
|
|
182
|
-
return this._body;
|
|
183
|
-
}
|
|
184
|
-
get headers() {
|
|
185
|
-
return this._headers;
|
|
186
|
-
}
|
|
187
|
-
set headers(headers) {
|
|
188
|
-
this._headers = headers;
|
|
189
|
-
}
|
|
190
136
|
setHeader(key, value) {
|
|
191
137
|
setHeader(this.headers, key, value);
|
|
192
138
|
}
|
|
193
139
|
mergeHeader(key, value) {
|
|
194
140
|
mergeHeader(this.headers, key, value);
|
|
195
141
|
}
|
|
142
|
+
addContentHeader() {
|
|
143
|
+
if (this.mimeType) {
|
|
144
|
+
this.headers.set("Content-Type", getContentType(this.mimeType));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
addCacheHeader() {
|
|
148
|
+
if (this.cache) {
|
|
149
|
+
this.headers.set("Cache-Control", CacheControl.stringify(this.cache));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
196
152
|
};
|
|
197
153
|
var CorsResponse = class extends BasicResponse {
|
|
198
|
-
constructor(cors, content = null
|
|
199
|
-
super(content
|
|
154
|
+
constructor(cors, content = null) {
|
|
155
|
+
super(content);
|
|
200
156
|
this.cors = cors;
|
|
201
157
|
}
|
|
202
158
|
addCorsHeaders() {
|
|
@@ -219,89 +175,105 @@ var CorsResponse = class extends BasicResponse {
|
|
|
219
175
|
}
|
|
220
176
|
};
|
|
221
177
|
var WorkerResponse = class extends CorsResponse {
|
|
178
|
+
constructor(cors, body = null, cache) {
|
|
179
|
+
super(cors, body);
|
|
180
|
+
this.cache = cache;
|
|
181
|
+
}
|
|
222
182
|
createResponse() {
|
|
223
183
|
this.addCorsHeaders();
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
return new Response(
|
|
184
|
+
this.addCacheHeader();
|
|
185
|
+
const body = this.status === StatusCodes.NO_CONTENT ? null : this.body;
|
|
186
|
+
if (body) this.addContentHeader();
|
|
187
|
+
return new Response(body, this.responseInit);
|
|
228
188
|
}
|
|
229
189
|
};
|
|
230
190
|
var ClonedResponse = class extends WorkerResponse {
|
|
231
|
-
constructor(cors, response) {
|
|
232
|
-
|
|
233
|
-
|
|
191
|
+
constructor(cors, response, cache) {
|
|
192
|
+
const clone = response.clone();
|
|
193
|
+
super(cors, clone.body);
|
|
194
|
+
this.headers = new Headers(clone.headers);
|
|
195
|
+
this.status = clone.status;
|
|
196
|
+
this.statusText = clone.statusText;
|
|
197
|
+
this.cache = cache;
|
|
234
198
|
}
|
|
235
199
|
};
|
|
236
|
-
var
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
this.
|
|
200
|
+
var SuccessResponse = class extends WorkerResponse {
|
|
201
|
+
constructor(cors, body = null, cache, status = StatusCodes.OK) {
|
|
202
|
+
super(cors, body);
|
|
203
|
+
this.cache = cache;
|
|
204
|
+
this.status = status;
|
|
241
205
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
this.
|
|
247
|
-
}
|
|
248
|
-
get body() {
|
|
249
|
-
return JSON.stringify(this.json);
|
|
206
|
+
};
|
|
207
|
+
var JsonResponse = class extends SuccessResponse {
|
|
208
|
+
constructor(cors, json = {}, cache, status = StatusCodes.OK) {
|
|
209
|
+
super(cors, JSON.stringify(json), cache, status);
|
|
210
|
+
this.mimeType = "application/json" /* JSON */;
|
|
250
211
|
}
|
|
251
212
|
};
|
|
252
|
-
var HtmlResponse = class extends
|
|
253
|
-
constructor(cors,
|
|
254
|
-
super(cors,
|
|
213
|
+
var HtmlResponse = class extends SuccessResponse {
|
|
214
|
+
constructor(cors, body, cache, status = StatusCodes.OK) {
|
|
215
|
+
super(cors, body, cache, status);
|
|
216
|
+
this.mimeType = "text/html" /* HTML */;
|
|
255
217
|
}
|
|
256
218
|
};
|
|
257
|
-
var TextResponse = class extends
|
|
258
|
-
constructor(cors, content,
|
|
259
|
-
super(cors, content,
|
|
219
|
+
var TextResponse = class extends SuccessResponse {
|
|
220
|
+
constructor(cors, content, cache, status = StatusCodes.OK) {
|
|
221
|
+
super(cors, content, cache, status);
|
|
222
|
+
this.mimeType = "text/plain" /* PLAIN_TEXT */;
|
|
260
223
|
}
|
|
261
224
|
};
|
|
262
225
|
var Head = class extends WorkerResponse {
|
|
263
|
-
constructor(cors,
|
|
264
|
-
super(cors, null
|
|
265
|
-
this.headers = new Headers(
|
|
226
|
+
constructor(cors, get) {
|
|
227
|
+
super(cors, null);
|
|
228
|
+
this.headers = new Headers(get.headers);
|
|
266
229
|
}
|
|
267
230
|
};
|
|
268
|
-
var Options = class extends
|
|
231
|
+
var Options = class extends SuccessResponse {
|
|
269
232
|
constructor(cors) {
|
|
270
|
-
super(cors, null, StatusCodes.NO_CONTENT);
|
|
233
|
+
super(cors, null, void 0, StatusCodes.NO_CONTENT);
|
|
271
234
|
this.setHeader("Allow", this.cors.getAllowMethods());
|
|
272
235
|
}
|
|
273
236
|
};
|
|
274
237
|
var HttpError = class extends JsonResponse {
|
|
275
|
-
constructor(cors,
|
|
276
|
-
|
|
238
|
+
constructor(cors, status, details) {
|
|
239
|
+
const cache = {
|
|
240
|
+
"no-cache": true,
|
|
241
|
+
"no-store": true,
|
|
242
|
+
"must-revalidate": true
|
|
243
|
+
};
|
|
244
|
+
super(cors, void 0, cache, status);
|
|
277
245
|
this.details = details;
|
|
278
246
|
}
|
|
279
247
|
get json() {
|
|
280
248
|
return {
|
|
281
|
-
|
|
282
|
-
error: getReasonPhrase(this.
|
|
283
|
-
details: this.details ?? getReasonPhrase(this.
|
|
249
|
+
status: this.status,
|
|
250
|
+
error: getReasonPhrase(this.status),
|
|
251
|
+
details: this.details ?? getReasonPhrase(this.status)
|
|
284
252
|
};
|
|
285
253
|
}
|
|
254
|
+
createResponse() {
|
|
255
|
+
this.body = JSON.stringify(this.json);
|
|
256
|
+
return super.createResponse();
|
|
257
|
+
}
|
|
286
258
|
};
|
|
287
259
|
var BadRequest = class extends HttpError {
|
|
288
|
-
constructor(cors,
|
|
289
|
-
super(cors, StatusCodes.BAD_REQUEST,
|
|
260
|
+
constructor(cors, details) {
|
|
261
|
+
super(cors, StatusCodes.BAD_REQUEST, details);
|
|
290
262
|
}
|
|
291
263
|
};
|
|
292
264
|
var Unauthorized = class extends HttpError {
|
|
293
|
-
constructor(cors,
|
|
294
|
-
super(cors, StatusCodes.UNAUTHORIZED,
|
|
265
|
+
constructor(cors, details) {
|
|
266
|
+
super(cors, StatusCodes.UNAUTHORIZED, details);
|
|
295
267
|
}
|
|
296
268
|
};
|
|
297
269
|
var Forbidden = class extends HttpError {
|
|
298
|
-
constructor(cors,
|
|
299
|
-
super(cors, StatusCodes.FORBIDDEN,
|
|
270
|
+
constructor(cors, details) {
|
|
271
|
+
super(cors, StatusCodes.FORBIDDEN, details);
|
|
300
272
|
}
|
|
301
273
|
};
|
|
302
274
|
var NotFound = class extends HttpError {
|
|
303
|
-
constructor(cors,
|
|
304
|
-
super(cors, StatusCodes.NOT_FOUND,
|
|
275
|
+
constructor(cors, details) {
|
|
276
|
+
super(cors, StatusCodes.NOT_FOUND, details);
|
|
305
277
|
}
|
|
306
278
|
};
|
|
307
279
|
var MethodNotAllowed = class extends HttpError {
|
|
@@ -317,8 +289,8 @@ var MethodNotAllowed = class extends HttpError {
|
|
|
317
289
|
}
|
|
318
290
|
};
|
|
319
291
|
var InternalServerError = class extends HttpError {
|
|
320
|
-
constructor(cors,
|
|
321
|
-
super(cors, StatusCodes.INTERNAL_SERVER_ERROR,
|
|
292
|
+
constructor(cors, details) {
|
|
293
|
+
super(cors, StatusCodes.INTERNAL_SERVER_ERROR, details);
|
|
322
294
|
}
|
|
323
295
|
};
|
|
324
296
|
var NotImplemented = class extends HttpError {
|
|
@@ -327,18 +299,17 @@ var NotImplemented = class extends HttpError {
|
|
|
327
299
|
}
|
|
328
300
|
};
|
|
329
301
|
var ServiceUnavailable = class extends HttpError {
|
|
330
|
-
constructor(cors,
|
|
331
|
-
super(cors, StatusCodes.SERVICE_UNAVAILABLE,
|
|
302
|
+
constructor(cors, details) {
|
|
303
|
+
super(cors, StatusCodes.SERVICE_UNAVAILABLE, details);
|
|
332
304
|
}
|
|
333
305
|
};
|
|
334
306
|
|
|
335
307
|
// src/basic-worker.ts
|
|
336
308
|
var BasicWorker = class {
|
|
337
|
-
constructor(_request, _env = {}, _ctx
|
|
309
|
+
constructor(_request, _env = {}, _ctx) {
|
|
338
310
|
this._request = _request;
|
|
339
311
|
this._env = _env;
|
|
340
312
|
this._ctx = _ctx;
|
|
341
|
-
this._logger = _logger;
|
|
342
313
|
}
|
|
343
314
|
get request() {
|
|
344
315
|
return this._request;
|
|
@@ -349,9 +320,6 @@ var BasicWorker = class {
|
|
|
349
320
|
get ctx() {
|
|
350
321
|
return this._ctx;
|
|
351
322
|
}
|
|
352
|
-
get log() {
|
|
353
|
-
return this._logger;
|
|
354
|
-
}
|
|
355
323
|
async fetch() {
|
|
356
324
|
if (!this.isAllowed(this.request.method)) {
|
|
357
325
|
return this.getResponse(MethodNotAllowed, this.request.method);
|
|
@@ -489,8 +457,8 @@ var RoutedWorker = class extends BasicWorker {
|
|
|
489
457
|
export {
|
|
490
458
|
BadRequest,
|
|
491
459
|
BasicWorker,
|
|
460
|
+
CacheControl2 as CacheControl,
|
|
492
461
|
ClonedResponse,
|
|
493
|
-
ConsoleLogger,
|
|
494
462
|
Forbidden,
|
|
495
463
|
Head,
|
|
496
464
|
HtmlResponse,
|
|
@@ -508,6 +476,7 @@ export {
|
|
|
508
476
|
Routes,
|
|
509
477
|
ServiceUnavailable,
|
|
510
478
|
StatusCodes2 as StatusCodes,
|
|
479
|
+
SuccessResponse,
|
|
511
480
|
TextResponse,
|
|
512
481
|
Time,
|
|
513
482
|
Unauthorized,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/common.ts","../src/logging.ts","../src/response.ts","../src/basic-worker.ts","../src/routes.ts","../src/routed-worker.ts"],"sourcesContent":["/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport { StatusCodes } from \"http-status-codes\";\n\nexport * from \"./basic-worker\";\nexport * from \"./common\";\nexport * from \"./logging\";\nexport * from \"./response\";\nexport * from \"./routes\";\nexport * from \"./routed-worker\";\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const Time = {\n Second: 1,\n Minute: 60,\n Hour: 60 * 60,\n Day: 60 * 60 * 24,\n Week: 60 * 60 * 24 * 7,\n} as const;\n\nexport enum Method {\n GET = \"GET\",\n PUT = \"PUT\",\n POST = \"POST\",\n PATCH = \"PATCH\",\n DELETE = \"DELETE\",\n HEAD = \"HEAD\",\n OPTIONS = \"OPTIONS\",\n}\nconst METHOD_SET: Set<string> = new Set(Object.values(Method));\n\nexport function isMethod(value: string): value is Method {\n return METHOD_SET.has(value);\n}\n\nexport function getContentType(type: MimeType): string {\n if (ADD_CHARSET.has(type)) {\n return `${type}; charset=utf-8`;\n }\n return type;\n}\n\nexport enum MimeType {\n PLAIN_TEXT = \"text/plain\",\n HTML = \"text/html\",\n CSS = \"text/css\",\n CSV = \"text/csv\",\n XML = \"text/xml\",\n MARKDOWN = \"text/markdown\",\n RICH_TEXT = \"text/richtext\",\n JSON = \"application/json\",\n XML_APP = \"application/xml\",\n YAML = \"application/x-yaml\",\n FORM_URLENCODED = \"application/x-www-form-urlencoded\",\n NDJSON = \"application/x-ndjson\",\n MSGPACK = \"application/x-msgpack\",\n PROTOBUF = \"application/x-protobuf\",\n MULTIPART_FORM_DATA = \"multipart/form-data\",\n MULTIPART_MIXED = \"multipart/mixed\",\n MULTIPART_ALTERNATIVE = \"multipart/alternative\",\n MULTIPART_DIGEST = \"multipart/digest\",\n MULTIPART_RELATED = \"multipart/related\",\n MULTIPART_SIGNED = \"multipart/signed\",\n MULTIPART_ENCRYPTED = \"multipart/encrypted\",\n OCTET_STREAM = \"application/octet-stream\",\n PDF = \"application/pdf\",\n ZIP = \"application/zip\",\n GZIP = \"application/gzip\",\n MSWORD = \"application/msword\",\n DOCX = \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n EXCEL = \"application/vnd.ms-excel\",\n XLSX = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n POWERPOINT = \"application/vnd.ms-powerpoint\",\n PPTX = \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n ICO = \"image/x-icon\",\n ICO_MS = \"image/vnd.microsoft.icon\",\n GIF = \"image/gif\",\n PNG = \"image/png\",\n JPEG = \"image/jpeg\",\n WEBP = \"image/webp\",\n SVG = \"image/svg+xml\",\n HEIF = \"image/heif\",\n AVIF = \"image/avif\",\n EVENT_STREAM = \"text/event-stream\",\n TAR = \"application/x-tar\",\n BZIP2 = \"application/x-bzip2\",\n}\n\nconst ADD_CHARSET: Set<MimeType> = new Set([\n MimeType.PLAIN_TEXT,\n MimeType.HTML,\n MimeType.CSS,\n MimeType.CSV,\n MimeType.MARKDOWN,\n MimeType.XML,\n MimeType.JSON,\n MimeType.XML_APP,\n MimeType.FORM_URLENCODED,\n MimeType.NDJSON,\n MimeType.RICH_TEXT,\n MimeType.SVG,\n]);\n\nexport function setHeader(headers: Headers, key: string, value: string | string[]): void {\n const raw = Array.isArray(value) ? value : [value];\n const values = Array.from(new Set(raw.map((v) => v.trim()))).filter((v) => v.length);\n\n if (!values.length) {\n headers.delete(key);\n return;\n }\n\n headers.set(key, values.join(\", \"));\n}\n\nexport function mergeHeader(headers: Headers, key: string, value: string | string[]): void {\n const values = Array.isArray(value) ? value : [value];\n if (!values.length) return;\n\n const existing = headers.get(key);\n if (existing) {\n const merged = existing.split(\",\").map((v) => v.trim());\n values.forEach((v) => merged.push(v.trim()));\n setHeader(headers, key, merged);\n } else {\n setHeader(headers, key, values);\n }\n}\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface BaseLogEntry {\n timestamp: string;\n level: LogLevel;\n message: string;\n correlationId?: string;\n}\n\nexport interface ErrorLogEntry extends BaseLogEntry {\n level: \"error\";\n error?: string;\n stack?: string;\n}\n\nexport type LogEntry = BaseLogEntry | ErrorLogEntry;\n\nexport interface Logger {\n log(level: LogLevel, message: string, correlationId?: string, err?: Error): void;\n format(level: LogLevel, message: string): string;\n flush(): Promise<void>;\n\n debug(message: string, correlationId?: string): void;\n info(message: string, correlationId?: string): void;\n warn(message: string, correlationId?: string): void;\n error(message: string, error?: unknown, correlationId?: string): void;\n}\n\nexport class ConsoleLogger implements Logger {\n public log(level: LogLevel, message: string, correlationId?: string, err?: unknown): void {\n const error = err instanceof Error ? err.message : err ? String(err) : undefined;\n const stack = err instanceof Error ? err.stack : undefined;\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n message,\n ...(error ? { error, stack } : {}),\n ...(correlationId ? { correlationId } : {}),\n };\n\n switch (level) {\n case \"debug\":\n console.debug(entry);\n break;\n case \"info\":\n console.info(entry);\n break;\n case \"warn\":\n console.warn(entry);\n break;\n case \"error\":\n console.error(entry);\n break;\n default:\n console.log(entry);\n break;\n }\n }\n\n public format(_level: LogLevel, message: string): string {\n return message;\n }\n\n public async flush(): Promise<void> {\n return;\n }\n\n public debug(message: string, correlationId?: string): void {\n this.log(\"debug\", message, correlationId);\n }\n\n public info(message: string, correlationId?: string): void {\n this.log(\"info\", message, correlationId);\n }\n\n public warn(message: string, correlationId?: string): void {\n this.log(\"warn\", message, correlationId);\n }\n\n public error(message: string, err?: unknown, correlationId?: string): void {\n this.log(\"error\", message, correlationId, err);\n }\n}\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getReasonPhrase, StatusCodes } from \"http-status-codes\";\nimport { getContentType, mergeHeader, Method, MimeType, setHeader } from \"./common\";\n\nexport interface CorsProvider {\n getOrigin(): string | null;\n getAllowOrigins(): string[];\n getAllowMethods(): Method[];\n getAllowHeaders(): string[];\n getExposeHeaders(): string[];\n getMaxAge(): number;\n}\n\nexport interface ErrorJson {\n code: number;\n error: string;\n details: string;\n}\n\nclass BasicResponse {\n private _headers: Headers = new Headers();\n private _body: BodyInit | null;\n\n constructor(\n content: BodyInit | null = null,\n protected readonly code: StatusCodes = StatusCodes.OK,\n protected readonly mimeType: MimeType = MimeType.JSON\n ) {\n this._body = this.code === StatusCodes.NO_CONTENT ? null : content;\n }\n\n protected get responseInit(): ResponseInit {\n return {\n headers: this.headers,\n status: this.code,\n statusText: getReasonPhrase(this.code),\n };\n }\n\n protected get body(): BodyInit | null {\n return this._body;\n }\n\n protected get headers(): Headers {\n return this._headers;\n }\n\n protected set headers(headers: Headers) {\n this._headers = headers;\n }\n\n protected setHeader(key: string, value: string | string[]): void {\n setHeader(this.headers, key, value);\n }\n\n protected mergeHeader(key: string, value: string | string[]): void {\n mergeHeader(this.headers, key, value);\n }\n}\n\nclass CorsResponse extends BasicResponse {\n constructor(\n protected readonly cors: CorsProvider,\n content: BodyInit | null = null,\n code: StatusCodes = StatusCodes.OK,\n mimeType: MimeType = MimeType.JSON\n ) {\n super(content, code, mimeType);\n }\n\n protected addCorsHeaders(): void {\n const origin = this.cors.getOrigin();\n if (!origin) return; // no Origin, skip CORS\n\n this.headers.delete(\"Access-Control-Allow-Origin\");\n\n const allowed = this.cors.getAllowOrigins();\n if (allowed.includes(\"*\")) {\n this.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n } else if (allowed.includes(origin)) {\n this.setHeader(\"Access-Control-Allow-Origin\", origin);\n this.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n this.mergeHeader(\"Vary\", \"Origin\");\n }\n\n this.mergeHeader(\"Access-Control-Expose-Headers\", this.cors.getExposeHeaders());\n this.setHeader(\"Access-Control-Allow-Headers\", this.cors.getAllowHeaders());\n this.setHeader(\"Access-Control-Allow-Methods\", this.cors.getAllowMethods());\n this.setHeader(\"Access-Control-Max-Age\", String(this.cors.getMaxAge()));\n this.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n }\n}\n\nexport class WorkerResponse extends CorsResponse {\n public createResponse(): Response {\n this.addCorsHeaders();\n if (this.body) {\n this.headers.set(\"Content-Type\", getContentType(this.mimeType));\n }\n return new Response(this.body, this.responseInit);\n }\n}\n\nexport class ClonedResponse extends WorkerResponse {\n constructor(cors: CorsProvider, response: Response) {\n super(cors, response.body, response.status);\n this.headers = new Headers(response.headers);\n }\n}\n\nexport class JsonResponse extends WorkerResponse {\n private _json: object;\n constructor(cors: CorsProvider, content: object = {}, code: StatusCodes = StatusCodes.OK) {\n super(cors, null, code, MimeType.JSON);\n this._json = content;\n }\n\n public get json(): object {\n return this._json;\n }\n\n public set json(json: object) {\n this._json = json;\n }\n\n protected override get body(): string {\n return JSON.stringify(this.json);\n }\n}\n\nexport class HtmlResponse extends WorkerResponse {\n constructor(\n cors: CorsProvider,\n content: string,\n code: StatusCodes = StatusCodes.OK,\n type: MimeType = MimeType.HTML\n ) {\n super(cors, content, code, type);\n }\n}\n\nexport class TextResponse extends WorkerResponse {\n constructor(\n cors: CorsProvider,\n content: string,\n code: StatusCodes = StatusCodes.OK,\n type: MimeType = MimeType.PLAIN_TEXT\n ) {\n super(cors, content, code, type);\n }\n}\n\n/**\n * Remove the body from a GET response.\n */\nexport class Head extends WorkerResponse {\n constructor(cors: CorsProvider, response: Response) {\n super(cors, null, response.status);\n this.headers = new Headers(response.headers);\n }\n}\n\nexport class Options extends WorkerResponse {\n constructor(cors: CorsProvider) {\n super(cors, null, StatusCodes.NO_CONTENT);\n this.setHeader(\"Allow\", this.cors.getAllowMethods());\n }\n}\n\nexport class HttpError extends JsonResponse {\n constructor(cors: CorsProvider, code: StatusCodes, protected details?: string) {\n super(cors, {}, code);\n }\n\n public override get json(): ErrorJson {\n return {\n code: this.code,\n error: getReasonPhrase(this.code),\n details: this.details ?? getReasonPhrase(this.code),\n };\n }\n}\n\nexport class BadRequest extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.BAD_REQUEST, detail);\n }\n}\n\nexport class Unauthorized extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.UNAUTHORIZED, detail);\n }\n}\n\nexport class Forbidden extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.FORBIDDEN, detail);\n }\n}\n\nexport class NotFound extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.NOT_FOUND, detail);\n }\n}\n\nexport class MethodNotAllowed extends HttpError {\n constructor(cors: CorsProvider, method: string) {\n super(cors, StatusCodes.METHOD_NOT_ALLOWED, `${method} method not allowed.`);\n this.setHeader(\"Allow\", this.cors.getAllowMethods());\n }\n\n public override get json(): ErrorJson & { allowed: Method[] } {\n return {\n ...super.json,\n allowed: this.cors.getAllowMethods(),\n };\n }\n}\n\nexport class InternalServerError extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.INTERNAL_SERVER_ERROR, detail);\n }\n}\n\nexport class NotImplemented extends HttpError {\n constructor(cors: CorsProvider) {\n super(cors, StatusCodes.NOT_IMPLEMENTED);\n }\n}\n\nexport class ServiceUnavailable extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.SERVICE_UNAVAILABLE, detail);\n }\n}\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isMethod, Method, Time } from \"./common\";\nimport { ConsoleLogger, Logger } from \"./logging\";\nimport {\n CorsProvider,\n Head,\n InternalServerError,\n MethodNotAllowed,\n NotImplemented,\n Options,\n WorkerResponse,\n} from \"./response\";\n\nexport abstract class BasicWorker implements CorsProvider {\n constructor(\n private readonly _request: Request,\n private readonly _env: Env = {},\n private readonly _ctx?: ExecutionContext,\n private readonly _logger: Logger = new ConsoleLogger()\n ) {}\n\n protected get request(): Request {\n return this._request;\n }\n\n protected get env(): Env {\n return this._env;\n }\n\n protected get ctx(): ExecutionContext | undefined {\n return this._ctx;\n }\n\n protected get log(): Logger {\n return this._logger;\n }\n\n public async fetch(): Promise<Response> {\n if (!this.isAllowed(this.request.method)) {\n return this.getResponse(MethodNotAllowed, this.request.method);\n }\n\n try {\n return await this.dispatch(this.request);\n } catch (error) {\n return this.getResponse(InternalServerError, String(error));\n }\n }\n\n protected async dispatch(request: Request): Promise<Response> {\n const method = request.method as Method;\n const handler: Record<Method, () => Promise<Response>> = {\n GET: () => this.get(),\n PUT: () => this.put(),\n POST: () => this.post(),\n PATCH: () => this.patch(),\n DELETE: () => this.delete(),\n HEAD: () => this.head(),\n OPTIONS: () => this.options(),\n };\n return (handler[method] ?? (() => this.getResponse(MethodNotAllowed, method)))();\n }\n\n protected async get(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async put(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async post(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async patch(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async delete(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async options(): Promise<Response> {\n return this.getResponse(Options);\n }\n\n protected async head(): Promise<Response> {\n // Dispatch a new GET request created from the HEAD request\n // and return the GET response with the body removed.\n return this.getResponse(\n Head,\n await this.dispatch(new Request(this.request, { method: Method.GET }))\n );\n }\n\n protected getResponse<\n T extends WorkerResponse,\n Ctor extends new (cors: CorsProvider, ...args: any[]) => T\n >(\n ResponseClass: Ctor,\n ...args: ConstructorParameters<Ctor> extends [any, ...infer R] ? R : never\n ): Response {\n return new ResponseClass(this, ...args).createResponse();\n }\n\n public isAllowed(method: string): boolean {\n return isMethod(method) && this.getAllowMethods().includes(method);\n }\n\n public getAllowOrigins(): string[] {\n return [\"*\"];\n }\n\n public getAllowMethods(): Method[] {\n return [Method.GET, Method.OPTIONS, Method.HEAD];\n }\n\n public getAllowHeaders(): string[] {\n return [\"Content-Type\"];\n }\n\n public getExposeHeaders(): string[] {\n return [];\n }\n\n public getMaxAge(): number {\n return Time.Week;\n }\n\n public getOrigin(): string | null {\n return this.request.headers.get(\"Origin\");\n }\n}\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Method } from \"./common\";\n\nexport type RouteCallback = (...matches: string[]) => Response | Promise<Response>;\n\nexport type RouteInit = [Method, string, RouteCallback];\n\nexport class Route {\n public readonly pattern: RegExp;\n\n constructor(pattern: RegExp | string, public readonly callback: RouteCallback) {\n this.pattern = new RegExp(pattern);\n }\n}\n\nexport class Routes {\n private readonly map = new Map<Method, Route[]>();\n\n public add(method: Method, route: Route) {\n const existing = this.map.get(method);\n if (existing) {\n existing.push(route);\n } else {\n this.map.set(method, [route]);\n }\n return this;\n }\n\n public get(method: Method, url: string): Route | undefined {\n const routes = this.map.get(method);\n if (!routes) return undefined;\n\n const pathname = new URL(url).pathname;\n return routes.find(({ pattern }) => pattern.test(pathname));\n }\n}\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BasicWorker } from \"./basic-worker\";\nimport { Method } from \"./common\";\nimport { NotFound } from \"./response\";\nimport { Route, Routes, RouteInit, RouteCallback } from \"./routes\";\n\nexport abstract class RoutedWorker extends BasicWorker {\n private readonly routes: Routes = new Routes();\n\n protected initialize(routes: RouteInit[]) {\n routes.forEach(([method, pattern, callback]) => {\n this.add(method, pattern, callback);\n });\n }\n\n protected add(method: Method, pattern: RegExp | string, callback: RouteCallback) {\n this.routes.add(method, new Route(pattern, callback));\n return this;\n }\n\n protected async dispatch(request: Request): Promise<Response> {\n const route = this.routes.get(request.method as Method, request.url);\n if (!route) return super.dispatch(request);\n\n const match = new URL(request.url).pathname.match(route.pattern) ?? [];\n return route.callback.call(this, ...match);\n }\n\n protected override async get(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async put(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async post(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async patch(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async delete(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n}\n"],"mappings":"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","names":["StatusCodes","Method","MimeType"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/common.ts","../src/response.ts","../src/basic-worker.ts","../src/routes.ts","../src/routed-worker.ts"],"sourcesContent":["/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport { StatusCodes } from \"http-status-codes\";\nexport { CacheControl } from \"cache-control-parser\";\n\nexport * from \"./basic-worker\";\nexport * from \"./common\";\nexport * from \"./response\";\nexport * from \"./routes\";\nexport * from \"./routed-worker\";\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const Time = {\n Second: 1,\n Minute: 60,\n Hour: 60 * 60,\n Day: 60 * 60 * 24,\n Week: 60 * 60 * 24 * 7,\n Year: 60 * 60 * 24 * 365,\n} as const;\n\nexport enum Method {\n GET = \"GET\",\n PUT = \"PUT\",\n POST = \"POST\",\n PATCH = \"PATCH\",\n DELETE = \"DELETE\",\n HEAD = \"HEAD\",\n OPTIONS = \"OPTIONS\",\n}\nconst METHOD_SET: Set<string> = new Set(Object.values(Method));\n\nexport function isMethod(value: string): value is Method {\n return METHOD_SET.has(value);\n}\n\nexport function getContentType(type: MimeType): string {\n if (ADD_CHARSET.has(type)) {\n return `${type}; charset=utf-8`;\n }\n return type;\n}\n\nexport enum MimeType {\n PLAIN_TEXT = \"text/plain\",\n HTML = \"text/html\",\n CSS = \"text/css\",\n CSV = \"text/csv\",\n XML = \"text/xml\",\n MARKDOWN = \"text/markdown\",\n RICH_TEXT = \"text/richtext\",\n JSON = \"application/json\",\n XML_APP = \"application/xml\",\n YAML = \"application/x-yaml\",\n FORM_URLENCODED = \"application/x-www-form-urlencoded\",\n NDJSON = \"application/x-ndjson\",\n MSGPACK = \"application/x-msgpack\",\n PROTOBUF = \"application/x-protobuf\",\n MULTIPART_FORM_DATA = \"multipart/form-data\",\n MULTIPART_MIXED = \"multipart/mixed\",\n MULTIPART_ALTERNATIVE = \"multipart/alternative\",\n MULTIPART_DIGEST = \"multipart/digest\",\n MULTIPART_RELATED = \"multipart/related\",\n MULTIPART_SIGNED = \"multipart/signed\",\n MULTIPART_ENCRYPTED = \"multipart/encrypted\",\n OCTET_STREAM = \"application/octet-stream\",\n PDF = \"application/pdf\",\n ZIP = \"application/zip\",\n GZIP = \"application/gzip\",\n MSWORD = \"application/msword\",\n DOCX = \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n EXCEL = \"application/vnd.ms-excel\",\n XLSX = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n POWERPOINT = \"application/vnd.ms-powerpoint\",\n PPTX = \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n ICO = \"image/x-icon\",\n ICO_MS = \"image/vnd.microsoft.icon\",\n GIF = \"image/gif\",\n PNG = \"image/png\",\n JPEG = \"image/jpeg\",\n WEBP = \"image/webp\",\n SVG = \"image/svg+xml\",\n HEIF = \"image/heif\",\n AVIF = \"image/avif\",\n EVENT_STREAM = \"text/event-stream\",\n TAR = \"application/x-tar\",\n BZIP2 = \"application/x-bzip2\",\n}\n\nconst ADD_CHARSET: Set<MimeType> = new Set([\n MimeType.PLAIN_TEXT,\n MimeType.HTML,\n MimeType.CSS,\n MimeType.CSV,\n MimeType.MARKDOWN,\n MimeType.XML,\n MimeType.JSON,\n MimeType.XML_APP,\n MimeType.FORM_URLENCODED,\n MimeType.NDJSON,\n MimeType.RICH_TEXT,\n MimeType.SVG,\n]);\n\nexport function setHeader(headers: Headers, key: string, value: string | string[]): void {\n const raw = Array.isArray(value) ? value : [value];\n const values = Array.from(new Set(raw.map((v) => v.trim()))).filter((v) => v.length);\n\n if (!values.length) {\n headers.delete(key);\n return;\n }\n\n headers.set(key, values.join(\", \"));\n}\n\nexport function mergeHeader(headers: Headers, key: string, value: string | string[]): void {\n const values = Array.isArray(value) ? value : [value];\n if (!values.length) return;\n\n const existing = headers.get(key);\n if (existing) {\n const merged = existing.split(\",\").map((v) => v.trim());\n values.forEach((v) => merged.push(v.trim()));\n setHeader(headers, key, merged);\n } else {\n setHeader(headers, key, values);\n }\n}\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getReasonPhrase, StatusCodes } from \"http-status-codes\";\nimport { getContentType, mergeHeader, Method, MimeType, setHeader } from \"./common\";\nimport CacheControl from \"cache-control-parser\";\n\nexport interface CorsProvider {\n getOrigin(): string | null;\n getAllowOrigins(): string[];\n getAllowMethods(): Method[];\n getAllowHeaders(): string[];\n getExposeHeaders(): string[];\n getMaxAge(): number;\n}\n\nexport interface ErrorJson {\n status: number;\n error: string;\n details: string;\n}\n\nabstract class BasicResponse {\n public headers: Headers = new Headers();\n public body: BodyInit | null;\n public status: StatusCodes = StatusCodes.OK;\n public statusText?: string;\n public mimeType?: MimeType;\n public cache?: CacheControl.CacheControl;\n\n constructor(content: BodyInit | null = null) {\n this.body = this.status === StatusCodes.NO_CONTENT ? null : content;\n }\n\n protected get responseInit(): ResponseInit {\n return {\n headers: this.headers,\n status: this.status,\n statusText: this.statusText ?? getReasonPhrase(this.status),\n };\n }\n\n public setHeader(key: string, value: string | string[]): void {\n setHeader(this.headers, key, value);\n }\n\n public mergeHeader(key: string, value: string | string[]): void {\n mergeHeader(this.headers, key, value);\n }\n\n public addContentHeader() {\n if (this.mimeType) {\n this.headers.set(\"Content-Type\", getContentType(this.mimeType));\n }\n }\n\n public addCacheHeader() {\n if (this.cache) {\n this.headers.set(\"Cache-Control\", CacheControl.stringify(this.cache));\n }\n }\n}\n\nabstract class CorsResponse extends BasicResponse {\n constructor(public readonly cors: CorsProvider, content: BodyInit | null = null) {\n super(content);\n }\n\n protected addCorsHeaders(): void {\n const origin = this.cors.getOrigin();\n if (!origin) return; // no Origin, skip CORS\n\n this.headers.delete(\"Access-Control-Allow-Origin\");\n\n const allowed = this.cors.getAllowOrigins();\n if (allowed.includes(\"*\")) {\n this.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n } else if (allowed.includes(origin)) {\n this.setHeader(\"Access-Control-Allow-Origin\", origin);\n this.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n this.mergeHeader(\"Vary\", \"Origin\");\n }\n\n this.mergeHeader(\"Access-Control-Expose-Headers\", this.cors.getExposeHeaders());\n this.setHeader(\"Access-Control-Allow-Headers\", this.cors.getAllowHeaders());\n this.setHeader(\"Access-Control-Allow-Methods\", this.cors.getAllowMethods());\n this.setHeader(\"Access-Control-Max-Age\", String(this.cors.getMaxAge()));\n this.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n }\n}\n\nexport abstract class WorkerResponse extends CorsResponse {\n constructor(\n cors: CorsProvider,\n body: BodyInit | null = null,\n cache?: CacheControl.CacheControl\n ) {\n super(cors, body);\n this.cache = cache;\n }\n\n public createResponse(): Response {\n this.addCorsHeaders();\n this.addCacheHeader();\n const body = this.status === StatusCodes.NO_CONTENT ? null : this.body;\n if (body) this.addContentHeader();\n return new Response(body, this.responseInit);\n }\n}\n\nexport class ClonedResponse extends WorkerResponse {\n constructor(cors: CorsProvider, response: Response, cache?: CacheControl.CacheControl) {\n const clone = response.clone();\n super(cors, clone.body);\n this.headers = new Headers(clone.headers);\n this.status = clone.status;\n this.statusText = clone.statusText;\n this.cache = cache;\n }\n}\n\nexport class SuccessResponse extends WorkerResponse {\n constructor(\n cors: CorsProvider,\n body: BodyInit | null = null,\n cache?: CacheControl.CacheControl,\n status: StatusCodes = StatusCodes.OK\n ) {\n super(cors, body);\n this.cache = cache;\n this.status = status;\n }\n}\n\nexport class JsonResponse extends SuccessResponse {\n constructor(\n cors: CorsProvider,\n json: object = {},\n cache?: CacheControl.CacheControl,\n status: StatusCodes = StatusCodes.OK\n ) {\n super(cors, JSON.stringify(json), cache, status);\n this.mimeType = MimeType.JSON;\n }\n}\n\nexport class HtmlResponse extends SuccessResponse {\n constructor(\n cors: CorsProvider,\n body: string,\n cache?: CacheControl.CacheControl,\n status: StatusCodes = StatusCodes.OK\n ) {\n super(cors, body, cache, status);\n this.mimeType = MimeType.HTML;\n }\n}\n\nexport class TextResponse extends SuccessResponse {\n constructor(\n cors: CorsProvider,\n content: string,\n cache?: CacheControl.CacheControl,\n status: StatusCodes = StatusCodes.OK\n ) {\n super(cors, content, cache, status);\n this.mimeType = MimeType.PLAIN_TEXT;\n }\n}\n\n/**\n * Remove the body from a GET response.\n */\nexport class Head extends WorkerResponse {\n constructor(cors: CorsProvider, get: Response) {\n super(cors, null);\n this.headers = new Headers(get.headers);\n }\n}\n\nexport class Options extends SuccessResponse {\n constructor(cors: CorsProvider) {\n super(cors, null, undefined, StatusCodes.NO_CONTENT);\n this.setHeader(\"Allow\", this.cors.getAllowMethods());\n }\n}\n\nexport class HttpError extends JsonResponse {\n constructor(cors: CorsProvider, status: StatusCodes, protected readonly details?: string) {\n const cache: CacheControl.CacheControl = {\n \"no-cache\": true,\n \"no-store\": true,\n \"must-revalidate\": true,\n };\n super(cors, undefined, cache, status);\n }\n\n public get json(): ErrorJson {\n return {\n status: this.status,\n error: getReasonPhrase(this.status),\n details: this.details ?? getReasonPhrase(this.status),\n };\n }\n\n public override createResponse(): Response {\n this.body = JSON.stringify(this.json);\n return super.createResponse();\n }\n}\n\nexport class BadRequest extends HttpError {\n constructor(cors: CorsProvider, details?: string) {\n super(cors, StatusCodes.BAD_REQUEST, details);\n }\n}\n\nexport class Unauthorized extends HttpError {\n constructor(cors: CorsProvider, details?: string) {\n super(cors, StatusCodes.UNAUTHORIZED, details);\n }\n}\n\nexport class Forbidden extends HttpError {\n constructor(cors: CorsProvider, details?: string) {\n super(cors, StatusCodes.FORBIDDEN, details);\n }\n}\n\nexport class NotFound extends HttpError {\n constructor(cors: CorsProvider, details?: string) {\n super(cors, StatusCodes.NOT_FOUND, details);\n }\n}\n\nexport class MethodNotAllowed extends HttpError {\n constructor(cors: CorsProvider, method: string) {\n super(cors, StatusCodes.METHOD_NOT_ALLOWED, `${method} method not allowed.`);\n this.setHeader(\"Allow\", this.cors.getAllowMethods());\n }\n\n public override get json(): ErrorJson & { allowed: Method[] } {\n return {\n ...super.json,\n allowed: this.cors.getAllowMethods(),\n };\n }\n}\n\nexport class InternalServerError extends HttpError {\n constructor(cors: CorsProvider, details?: string) {\n super(cors, StatusCodes.INTERNAL_SERVER_ERROR, details);\n }\n}\n\nexport class NotImplemented extends HttpError {\n constructor(cors: CorsProvider) {\n super(cors, StatusCodes.NOT_IMPLEMENTED);\n }\n}\n\nexport class ServiceUnavailable extends HttpError {\n constructor(cors: CorsProvider, details?: string) {\n super(cors, StatusCodes.SERVICE_UNAVAILABLE, details);\n }\n}\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isMethod, Method, Time } from \"./common\";\nimport {\n CorsProvider,\n Head,\n InternalServerError,\n MethodNotAllowed,\n NotImplemented,\n Options,\n WorkerResponse,\n} from \"./response\";\n\nexport abstract class BasicWorker implements CorsProvider {\n constructor(\n private readonly _request: Request,\n private readonly _env: Env = {},\n private readonly _ctx?: ExecutionContext\n ) {}\n\n protected get request(): Request {\n return this._request;\n }\n\n protected get env(): Env {\n return this._env;\n }\n\n protected get ctx(): ExecutionContext | undefined {\n return this._ctx;\n }\n\n public async fetch(): Promise<Response> {\n if (!this.isAllowed(this.request.method)) {\n return this.getResponse(MethodNotAllowed, this.request.method);\n }\n\n try {\n return await this.dispatch(this.request);\n } catch (error) {\n return this.getResponse(InternalServerError, String(error));\n }\n }\n\n protected async dispatch(request: Request): Promise<Response> {\n const method = request.method as Method;\n const handler: Record<Method, () => Promise<Response>> = {\n GET: () => this.get(),\n PUT: () => this.put(),\n POST: () => this.post(),\n PATCH: () => this.patch(),\n DELETE: () => this.delete(),\n HEAD: () => this.head(),\n OPTIONS: () => this.options(),\n };\n return (handler[method] ?? (() => this.getResponse(MethodNotAllowed, method)))();\n }\n\n protected async get(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async put(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async post(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async patch(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async delete(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async options(): Promise<Response> {\n return this.getResponse(Options);\n }\n\n protected async head(): Promise<Response> {\n // Dispatch a new GET request created from the HEAD request\n // and return the GET response with the body removed.\n return this.getResponse(\n Head,\n await this.dispatch(new Request(this.request, { method: Method.GET }))\n );\n }\n\n protected getResponse<\n T extends WorkerResponse,\n Ctor extends new (cors: CorsProvider, ...args: any[]) => T\n >(\n ResponseClass: Ctor,\n ...args: ConstructorParameters<Ctor> extends [any, ...infer R] ? R : never\n ): Response {\n return new ResponseClass(this, ...args).createResponse();\n }\n\n public isAllowed(method: string): boolean {\n return isMethod(method) && this.getAllowMethods().includes(method);\n }\n\n public getAllowOrigins(): string[] {\n return [\"*\"];\n }\n\n public getAllowMethods(): Method[] {\n return [Method.GET, Method.OPTIONS, Method.HEAD];\n }\n\n public getAllowHeaders(): string[] {\n return [\"Content-Type\"];\n }\n\n public getExposeHeaders(): string[] {\n return [];\n }\n\n public getMaxAge(): number {\n return Time.Week;\n }\n\n public getOrigin(): string | null {\n return this.request.headers.get(\"Origin\");\n }\n}\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Method } from \"./common\";\n\nexport type RouteCallback = (...matches: string[]) => Response | Promise<Response>;\n\nexport type RouteInit = [Method, string, RouteCallback];\n\nexport class Route {\n public readonly pattern: RegExp;\n\n constructor(pattern: RegExp | string, public readonly callback: RouteCallback) {\n this.pattern = new RegExp(pattern);\n }\n}\n\nexport class Routes {\n private readonly map = new Map<Method, Route[]>();\n\n public add(method: Method, route: Route) {\n const existing = this.map.get(method);\n if (existing) {\n existing.push(route);\n } else {\n this.map.set(method, [route]);\n }\n return this;\n }\n\n public get(method: Method, url: string): Route | undefined {\n const routes = this.map.get(method);\n if (!routes) return undefined;\n\n const pathname = new URL(url).pathname;\n return routes.find(({ pattern }) => pattern.test(pathname));\n }\n}\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BasicWorker } from \"./basic-worker\";\nimport { Method } from \"./common\";\nimport { NotFound } from \"./response\";\nimport { Route, Routes, RouteInit, RouteCallback } from \"./routes\";\n\nexport abstract class RoutedWorker extends BasicWorker {\n private readonly routes: Routes = new Routes();\n\n protected initialize(routes: RouteInit[]) {\n routes.forEach(([method, pattern, callback]) => {\n this.add(method, pattern, callback);\n });\n }\n\n protected add(method: Method, pattern: RegExp | string, callback: RouteCallback) {\n this.routes.add(method, new Route(pattern, callback));\n return this;\n }\n\n protected async dispatch(request: Request): Promise<Response> {\n const route = this.routes.get(request.method as Method, request.url);\n if (!route) return super.dispatch(request);\n\n const match = new URL(request.url).pathname.match(route.pattern) ?? [];\n return route.callback.call(this, ...match);\n }\n\n protected override async get(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async put(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async post(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async patch(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async delete(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n}\n"],"mappings":"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","names":["StatusCodes","CacheControl","Method","MimeType"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adonix.org/cloud-spark",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.63",
|
|
4
4
|
"description": "Ignite your Cloudflare Workers with a type-safe library for rapid development.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"vitest": "^3.2.4"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
+
"cache-control-parser": "^2.0.6",
|
|
53
54
|
"http-status-codes": "^2.3.0"
|
|
54
55
|
}
|
|
55
56
|
}
|