@adonix.org/cloud-spark 0.0.42 → 0.0.44

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 CHANGED
@@ -118,33 +118,33 @@ declare class Head extends WorkerResponse {
118
118
  declare class Options extends WorkerResponse {
119
119
  constructor(cors: CorsProvider);
120
120
  }
121
- declare class ErrorResponse extends JsonResponse {
121
+ declare class HttpError extends JsonResponse {
122
122
  protected details?: string | undefined;
123
123
  constructor(cors: CorsProvider, code: StatusCodes, details?: string | undefined);
124
124
  get json(): ErrorJson;
125
125
  }
126
- declare class BadRequest extends ErrorResponse {
126
+ declare class BadRequest extends HttpError {
127
127
  constructor(cors: CorsProvider, detail?: string);
128
128
  }
129
- declare class Unauthorized extends ErrorResponse {
129
+ declare class Unauthorized extends HttpError {
130
130
  constructor(cors: CorsProvider, detail?: string);
131
131
  }
132
- declare class Forbidden extends ErrorResponse {
132
+ declare class Forbidden extends HttpError {
133
133
  constructor(cors: CorsProvider, detail?: string);
134
134
  }
135
- declare class NotFound extends ErrorResponse {
135
+ declare class NotFound extends HttpError {
136
136
  constructor(cors: CorsProvider, detail?: string);
137
137
  }
138
- declare class MethodNotAllowed extends ErrorResponse {
138
+ declare class MethodNotAllowed extends HttpError {
139
139
  constructor(cors: CorsProvider, method: string);
140
140
  get json(): ErrorJson & {
141
141
  allowed: Method[];
142
142
  };
143
143
  }
144
- declare class InternalServerError extends ErrorResponse {
144
+ declare class InternalServerError extends HttpError {
145
145
  constructor(cors: CorsProvider, detail?: string);
146
146
  }
147
- declare class NotImplemented extends ErrorResponse {
147
+ declare class NotImplemented extends HttpError {
148
148
  constructor(cors: CorsProvider);
149
149
  }
150
150
 
@@ -152,10 +152,8 @@ declare abstract class BasicWorker implements CorsProvider {
152
152
  private readonly _request;
153
153
  private readonly _env;
154
154
  private readonly _ctx?;
155
- private readonly _requestUrl;
156
155
  constructor(_request: Request, _env?: Env, _ctx?: ExecutionContext | undefined);
157
156
  protected get request(): Request;
158
- protected get requestUrl(): URL;
159
157
  protected get env(): Env;
160
158
  protected get ctx(): ExecutionContext | undefined;
161
159
  fetch(): Promise<Response>;
@@ -192,7 +190,7 @@ declare class Routes {
192
190
  declare abstract class RoutedWorker extends BasicWorker {
193
191
  private readonly routes;
194
192
  protected initialize(routes: RouteInit[]): void;
195
- protected addRoute(method: Method, pattern: string, callback: RouteCallback): this;
193
+ protected add(method: Method, pattern: string, callback: RouteCallback): this;
196
194
  protected dispatch(request: Request): Promise<Response>;
197
195
  protected get(): Promise<Response>;
198
196
  protected put(): Promise<Response>;
@@ -201,4 +199,4 @@ declare abstract class RoutedWorker extends BasicWorker {
201
199
  protected delete(): Promise<Response>;
202
200
  }
203
201
 
204
- export { BadRequest, BasicWorker, type CorsProvider, type ErrorJson, ErrorResponse, Forbidden, Head, HtmlResponse, InternalServerError, JsonResponse, Method, MethodNotAllowed, MimeType, NotFound, NotImplemented, Options, Route, type RouteCallback, type RouteInit, RoutedWorker, Routes, TextResponse, Time, Unauthorized, WorkerResponse, ensure, getContentType, isMethod };
202
+ export { BadRequest, BasicWorker, type CorsProvider, type ErrorJson, Forbidden, Head, HtmlResponse, HttpError, InternalServerError, JsonResponse, Method, MethodNotAllowed, MimeType, NotFound, NotImplemented, Options, Route, type RouteCallback, type RouteInit, RoutedWorker, Routes, TextResponse, Time, Unauthorized, WorkerResponse, ensure, getContentType, isMethod };
package/dist/index.js CHANGED
@@ -204,7 +204,7 @@ var Options = class extends WorkerResponse {
204
204
  this.headers.set("Allow", this.getAllowMethods());
205
205
  }
206
206
  };
207
- var ErrorResponse = class extends JsonResponse {
207
+ var HttpError = class extends JsonResponse {
208
208
  constructor(cors, code, details) {
209
209
  super(cors, {}, code);
210
210
  this.details = details;
@@ -217,27 +217,27 @@ var ErrorResponse = class extends JsonResponse {
217
217
  };
218
218
  }
219
219
  };
220
- var BadRequest = class extends ErrorResponse {
220
+ var BadRequest = class extends HttpError {
221
221
  constructor(cors, detail) {
222
222
  super(cors, StatusCodes.BAD_REQUEST, detail);
223
223
  }
224
224
  };
225
- var Unauthorized = class extends ErrorResponse {
225
+ var Unauthorized = class extends HttpError {
226
226
  constructor(cors, detail) {
227
227
  super(cors, StatusCodes.UNAUTHORIZED, detail);
228
228
  }
229
229
  };
230
- var Forbidden = class extends ErrorResponse {
230
+ var Forbidden = class extends HttpError {
231
231
  constructor(cors, detail) {
232
232
  super(cors, StatusCodes.FORBIDDEN, detail);
233
233
  }
234
234
  };
235
- var NotFound = class extends ErrorResponse {
235
+ var NotFound = class extends HttpError {
236
236
  constructor(cors, detail) {
237
237
  super(cors, StatusCodes.NOT_FOUND, detail);
238
238
  }
239
239
  };
240
- var MethodNotAllowed = class extends ErrorResponse {
240
+ var MethodNotAllowed = class extends HttpError {
241
241
  constructor(cors, method) {
242
242
  super(
243
243
  cors,
@@ -253,12 +253,12 @@ var MethodNotAllowed = class extends ErrorResponse {
253
253
  };
254
254
  }
255
255
  };
256
- var InternalServerError = class extends ErrorResponse {
256
+ var InternalServerError = class extends HttpError {
257
257
  constructor(cors, detail) {
258
258
  super(cors, StatusCodes.INTERNAL_SERVER_ERROR, detail);
259
259
  }
260
260
  };
261
- var NotImplemented = class extends ErrorResponse {
261
+ var NotImplemented = class extends HttpError {
262
262
  constructor(cors) {
263
263
  super(cors, StatusCodes.NOT_IMPLEMENTED);
264
264
  }
@@ -270,15 +270,10 @@ var BasicWorker = class {
270
270
  this._request = _request;
271
271
  this._env = _env;
272
272
  this._ctx = _ctx;
273
- this._requestUrl = new URL(this.request.url);
274
273
  }
275
- _requestUrl;
276
274
  get request() {
277
275
  return this._request;
278
276
  }
279
- get requestUrl() {
280
- return this._requestUrl;
281
- }
282
277
  get env() {
283
278
  return this._env;
284
279
  }
@@ -381,17 +376,17 @@ var RoutedWorker = class extends BasicWorker {
381
376
  routes = new Routes();
382
377
  initialize(routes) {
383
378
  routes.forEach((route) => {
384
- this.addRoute(route[0], route[1], route[2]);
379
+ this.add(route[0], route[1], route[2]);
385
380
  });
386
381
  }
387
- addRoute(method, pattern, callback) {
382
+ add(method, pattern, callback) {
388
383
  this.routes.add(method, new Route(pattern, callback));
389
384
  return this;
390
385
  }
391
386
  async dispatch(request) {
392
387
  const route = this.routes.get(request.method, request.url);
393
388
  if (!route) return super.dispatch(request);
394
- const match = this.requestUrl.pathname.match(route.pattern) ?? [];
389
+ const match = new URL(request.url).pathname.match(route.pattern) ?? [];
395
390
  return route.callback.call(this, ...match);
396
391
  }
397
392
  async get() {
@@ -413,10 +408,10 @@ var RoutedWorker = class extends BasicWorker {
413
408
  export {
414
409
  BadRequest,
415
410
  BasicWorker,
416
- ErrorResponse,
417
411
  Forbidden,
418
412
  Head,
419
413
  HtmlResponse,
414
+ HttpError,
420
415
  InternalServerError,
421
416
  JsonResponse,
422
417
  Method,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/common.ts","../src/response.ts","../src/basic-worker.ts","../src/route.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 \"./common\";\nexport * from \"./response\";\nexport * from \"./basic-worker\";\nexport * from \"./routed-worker\";\nexport * from \"./route\";\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}\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 ensure<K, V>(map: Map<K, V>, key: K, factory: () => V): V {\n let value = map.get(key);\n if (value === undefined) {\n value = factory();\n map.set(key, value);\n }\n return 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","/*\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, Method, MimeType } from \"./common\";\n\nexport interface CorsProvider {\n getOrigin(): string | null;\n getAllowOrigins(): string[];\n getAllowMethods(): Method[];\n getAllowHeaders(): string[];\n getMaxAge(): number;\n}\n\nexport interface ErrorJson {\n code: number;\n error: string;\n details: string;\n}\n\nexport class WorkerResponse {\n private _headers: Headers = new Headers();\n private _body: BodyInit | null;\n\n constructor(\n protected readonly cors: CorsProvider,\n content: string | 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 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 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 addCorsHeaders(): void {\n const origin = this.cors.getOrigin();\n if (!origin) return; // no Origin, skip CORS\n\n if (this.getAllowOrigins().includes(\"*\")) {\n this.headers.set(\"Access-Control-Allow-Origin\", \"*\");\n } else if (this.getAllowOrigins().includes(origin)) {\n this.headers.set(\"Access-Control-Allow-Origin\", origin);\n this.headers.set(\"Access-Control-Allow-Credentials\", \"true\");\n this.headers.set(\"Vary\", \"Origin\");\n }\n this.headers.set(\n \"Access-Control-Allow-Headers\",\n this.getAllowHeaders()\n );\n this.headers.set(\n \"Access-Control-Allow-Methods\",\n this.getAllowMethods()\n );\n this.headers.set(\"Access-Control-Max-Age\", this.getMaxAge());\n this.headers.set(\"X-Content-Type-Options\", \"nosniff\");\n }\n\n protected getAllowMethods(): string {\n return this.cors.getAllowMethods().join(\", \");\n }\n\n protected getAllowHeaders(): string {\n return this.cors.getAllowHeaders().join(\", \");\n }\n\n protected getAllowOrigins(): string[] {\n return this.cors.getAllowOrigins();\n }\n\n protected getMaxAge(): string {\n return String(this.cors.getMaxAge());\n }\n}\n\nexport class JsonResponse extends WorkerResponse {\n private _json: object;\n constructor(\n cors: CorsProvider,\n content: object = {},\n code: StatusCodes = StatusCodes.OK\n ) {\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.headers.set(\"Allow\", this.getAllowMethods());\n }\n}\n\nexport class ErrorResponse extends JsonResponse {\n constructor(\n cors: CorsProvider,\n code: StatusCodes,\n protected details?: string\n ) {\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 ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.BAD_REQUEST, detail);\n }\n}\n\nexport class Unauthorized extends ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.UNAUTHORIZED, detail);\n }\n}\n\nexport class Forbidden extends ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.FORBIDDEN, detail);\n }\n}\n\nexport class NotFound extends ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.NOT_FOUND, detail);\n }\n}\n\nexport class MethodNotAllowed extends ErrorResponse {\n constructor(cors: CorsProvider, method: string) {\n super(\n cors,\n StatusCodes.METHOD_NOT_ALLOWED,\n `${method} method not allowed.`\n );\n this.headers.set(\"Allow\", this.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 ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.INTERNAL_SERVER_ERROR, detail);\n }\n}\n\nexport class NotImplemented extends ErrorResponse {\n constructor(cors: CorsProvider) {\n super(cors, StatusCodes.NOT_IMPLEMENTED);\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 private readonly _requestUrl: URL;\n\n constructor(\n private readonly _request: Request,\n private readonly _env: Env = {},\n private readonly _ctx?: ExecutionContext\n ) {\n this._requestUrl = new URL(this.request.url);\n }\n\n protected get request(): Request {\n return this._request;\n }\n\n protected get requestUrl(): URL {\n return this._requestUrl;\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 // Instead of using this.request, always pass in the request.\n // This enables creation of special reqeusts, for example for\n // HEAD requests.\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 // For HEAD method, we need to create a new GET request and\n // pass that through normal processing. Body is then removed\n // from the GET response and passed back as the HEAD response.\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 getAllowOrigins(): string[] {\n return [\"*\"];\n }\n\n public getAllowMethods(): Method[] {\n return [Method.GET, Method.OPTIONS, Method.HEAD];\n }\n\n public isAllowed(method: string): boolean {\n return isMethod(method) && this.getAllowMethods().includes(method);\n }\n\n public getAllowHeaders(): string[] {\n return [\"Content-Type\"];\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 { ensure, 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 routes = new Map<Method, Route[]>();\n\n public add(method: Method, route: Route) {\n ensure(this.routes, method, () => []).push(route);\n return this;\n }\n\n public get(method: Method, url: string): Route | undefined {\n const array = this.routes.get(method);\n if (!array) return undefined;\n\n return array.find(({ pattern }) => pattern.test(new URL(url).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 \"./route\";\n\nexport abstract class RoutedWorker extends BasicWorker {\n private readonly routes: Routes = new Routes();\n\n protected initialize(routes: RouteInit[]) {\n routes.forEach((route) => {\n this.addRoute(route[0], route[1], route[2]);\n });\n }\n\n protected addRoute(method: Method, pattern: 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 = this.requestUrl.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/route.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 \"./common\";\nexport * from \"./response\";\nexport * from \"./basic-worker\";\nexport * from \"./routed-worker\";\nexport * from \"./route\";\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}\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 ensure<K, V>(map: Map<K, V>, key: K, factory: () => V): V {\n let value = map.get(key);\n if (value === undefined) {\n value = factory();\n map.set(key, value);\n }\n return 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","/*\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, Method, MimeType } from \"./common\";\n\nexport interface CorsProvider {\n getOrigin(): string | null;\n getAllowOrigins(): string[];\n getAllowMethods(): Method[];\n getAllowHeaders(): string[];\n getMaxAge(): number;\n}\n\nexport interface ErrorJson {\n code: number;\n error: string;\n details: string;\n}\n\nexport class WorkerResponse {\n private _headers: Headers = new Headers();\n private _body: BodyInit | null;\n\n constructor(\n protected readonly cors: CorsProvider,\n content: string | 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 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 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 addCorsHeaders(): void {\n const origin = this.cors.getOrigin();\n if (!origin) return; // no Origin, skip CORS\n\n if (this.getAllowOrigins().includes(\"*\")) {\n this.headers.set(\"Access-Control-Allow-Origin\", \"*\");\n } else if (this.getAllowOrigins().includes(origin)) {\n this.headers.set(\"Access-Control-Allow-Origin\", origin);\n this.headers.set(\"Access-Control-Allow-Credentials\", \"true\");\n this.headers.set(\"Vary\", \"Origin\");\n }\n this.headers.set(\n \"Access-Control-Allow-Headers\",\n this.getAllowHeaders()\n );\n this.headers.set(\n \"Access-Control-Allow-Methods\",\n this.getAllowMethods()\n );\n this.headers.set(\"Access-Control-Max-Age\", this.getMaxAge());\n this.headers.set(\"X-Content-Type-Options\", \"nosniff\");\n }\n\n protected getAllowMethods(): string {\n return this.cors.getAllowMethods().join(\", \");\n }\n\n protected getAllowHeaders(): string {\n return this.cors.getAllowHeaders().join(\", \");\n }\n\n protected getAllowOrigins(): string[] {\n return this.cors.getAllowOrigins();\n }\n\n protected getMaxAge(): string {\n return String(this.cors.getMaxAge());\n }\n}\n\nexport class JsonResponse extends WorkerResponse {\n private _json: object;\n constructor(\n cors: CorsProvider,\n content: object = {},\n code: StatusCodes = StatusCodes.OK\n ) {\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.headers.set(\"Allow\", this.getAllowMethods());\n }\n}\n\nexport class HttpError extends JsonResponse {\n constructor(\n cors: CorsProvider,\n code: StatusCodes,\n protected details?: string\n ) {\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(\n cors,\n StatusCodes.METHOD_NOT_ALLOWED,\n `${method} method not allowed.`\n );\n this.headers.set(\"Allow\", this.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","/*\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 // Instead of using this.request, always pass in the request.\n // This enables creation of custom reqeusts, for example for\n // HEAD requests.\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 // For HEAD method, we need to create a new GET request and\n // pass that through normal processing. Body is then removed\n // from the GET response and passed back as the HEAD response.\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 getAllowOrigins(): string[] {\n return [\"*\"];\n }\n\n public getAllowMethods(): Method[] {\n return [Method.GET, Method.OPTIONS, Method.HEAD];\n }\n\n public isAllowed(method: string): boolean {\n return isMethod(method) && this.getAllowMethods().includes(method);\n }\n\n public getAllowHeaders(): string[] {\n return [\"Content-Type\"];\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 { ensure, 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 routes = new Map<Method, Route[]>();\n\n public add(method: Method, route: Route) {\n ensure(this.routes, method, () => []).push(route);\n return this;\n }\n\n public get(method: Method, url: string): Route | undefined {\n const array = this.routes.get(method);\n if (!array) return undefined;\n\n return array.find(({ pattern }) => pattern.test(new URL(url).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 \"./route\";\n\nexport abstract class RoutedWorker extends BasicWorker {\n private readonly routes: Routes = new Routes();\n\n protected initialize(routes: RouteInit[]) {\n routes.forEach((route) => {\n this.add(route[0], route[1], route[2]);\n });\n }\n\n protected add(method: Method, pattern: 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":";AAgBA,SAAS,eAAAA,oBAAmB;;;ACArB,IAAM,OAAO;AAAA,EAChB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM,KAAK;AAAA,EACX,KAAK,KAAK,KAAK;AAAA,EACf,MAAM,KAAK,KAAK,KAAK;AACzB;AAEO,IAAK,SAAL,kBAAKC,YAAL;AACH,EAAAA,QAAA,SAAM;AACN,EAAAA,QAAA,SAAM;AACN,EAAAA,QAAA,UAAO;AACP,EAAAA,QAAA,WAAQ;AACR,EAAAA,QAAA,YAAS;AACT,EAAAA,QAAA,UAAO;AACP,EAAAA,QAAA,aAAU;AAPF,SAAAA;AAAA,GAAA;AAUZ,IAAM,aAA0B,IAAI,IAAI,OAAO,OAAO,MAAM,CAAC;AAEtD,SAAS,SAAS,OAAgC;AACrD,SAAO,WAAW,IAAI,KAAK;AAC/B;AAEO,SAAS,OAAa,KAAgB,KAAQ,SAAqB;AACtE,MAAI,QAAQ,IAAI,IAAI,GAAG;AACvB,MAAI,UAAU,QAAW;AACrB,YAAQ,QAAQ;AAChB,QAAI,IAAI,KAAK,KAAK;AAAA,EACtB;AACA,SAAO;AACX;AAEO,SAAS,eAAe,MAAwB;AACnD,MAAI,YAAY,IAAI,IAAI,GAAG;AACvB,WAAO,GAAG,IAAI;AAAA,EAClB;AACA,SAAO;AACX;AAEO,IAAK,WAAL,kBAAKC,cAAL;AACH,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,cAAW;AACX,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,qBAAkB;AAClB,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,cAAW;AACX,EAAAA,UAAA,yBAAsB;AACtB,EAAAA,UAAA,qBAAkB;AAClB,EAAAA,UAAA,2BAAwB;AACxB,EAAAA,UAAA,sBAAmB;AACnB,EAAAA,UAAA,uBAAoB;AACpB,EAAAA,UAAA,sBAAmB;AACnB,EAAAA,UAAA,yBAAsB;AACtB,EAAAA,UAAA,kBAAe;AACf,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,kBAAe;AACf,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,WAAQ;AA3CA,SAAAA;AAAA,GAAA;AA8CZ,IAAM,cAA6B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;;;ACnGD,SAAS,iBAAiB,mBAAmB;AAiBtC,IAAM,iBAAN,MAAqB;AAAA,EAIxB,YACuB,MACnB,UAAyB,MACN,OAAoB,YAAY,IAChC,0CACrB;AAJqB;AAEA;AACA;AAEnB,SAAK,QAAQ,KAAK,SAAS,YAAY,aAAa,OAAO;AAAA,EAC/D;AAAA,EAVQ,WAAoB,IAAI,QAAQ;AAAA,EAChC;AAAA,EAWD,iBAA2B;AAC9B,SAAK,eAAe;AACpB,QAAI,KAAK,MAAM;AACX,WAAK,QAAQ,IAAI,gBAAgB,eAAe,KAAK,QAAQ,CAAC;AAAA,IAClE;AACA,WAAO,IAAI,SAAS,KAAK,MAAM,KAAK,YAAY;AAAA,EACpD;AAAA,EAEA,IAAc,eAA6B;AACvC,WAAO;AAAA,MACH,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,YAAY,gBAAgB,KAAK,IAAI;AAAA,IACzC;AAAA,EACJ;AAAA,EAEA,IAAc,OAAwB;AAClC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAc,UAAmB;AAC7B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAc,QAAQ,SAAkB;AACpC,SAAK,WAAW;AAAA,EACpB;AAAA,EAEU,iBAAuB;AAC7B,UAAM,SAAS,KAAK,KAAK,UAAU;AACnC,QAAI,CAAC,OAAQ;AAEb,QAAI,KAAK,gBAAgB,EAAE,SAAS,GAAG,GAAG;AACtC,WAAK,QAAQ,IAAI,+BAA+B,GAAG;AAAA,IACvD,WAAW,KAAK,gBAAgB,EAAE,SAAS,MAAM,GAAG;AAChD,WAAK,QAAQ,IAAI,+BAA+B,MAAM;AACtD,WAAK,QAAQ,IAAI,oCAAoC,MAAM;AAC3D,WAAK,QAAQ,IAAI,QAAQ,QAAQ;AAAA,IACrC;AACA,SAAK,QAAQ;AAAA,MACT;AAAA,MACA,KAAK,gBAAgB;AAAA,IACzB;AACA,SAAK,QAAQ;AAAA,MACT;AAAA,MACA,KAAK,gBAAgB;AAAA,IACzB;AACA,SAAK,QAAQ,IAAI,0BAA0B,KAAK,UAAU,CAAC;AAC3D,SAAK,QAAQ,IAAI,0BAA0B,SAAS;AAAA,EACxD;AAAA,EAEU,kBAA0B;AAChC,WAAO,KAAK,KAAK,gBAAgB,EAAE,KAAK,IAAI;AAAA,EAChD;AAAA,EAEU,kBAA0B;AAChC,WAAO,KAAK,KAAK,gBAAgB,EAAE,KAAK,IAAI;AAAA,EAChD;AAAA,EAEU,kBAA4B;AAClC,WAAO,KAAK,KAAK,gBAAgB;AAAA,EACrC;AAAA,EAEU,YAAoB;AAC1B,WAAO,OAAO,KAAK,KAAK,UAAU,CAAC;AAAA,EACvC;AACJ;AAEO,IAAM,eAAN,cAA2B,eAAe;AAAA,EACrC;AAAA,EACR,YACI,MACA,UAAkB,CAAC,GACnB,OAAoB,YAAY,IAClC;AACE,UAAM,MAAM,MAAM,mCAAmB;AACrC,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,IAAW,OAAe;AACtB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,KAAK,MAAc;AAC1B,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,IAAuB,OAAe;AAClC,WAAO,KAAK,UAAU,KAAK,IAAI;AAAA,EACnC;AACJ;AAEO,IAAM,eAAN,cAA2B,eAAe;AAAA,EAC7C,YACI,MACA,SACA,OAAoB,YAAY,IAChC,+BACF;AACE,UAAM,MAAM,SAAS,MAAM,IAAI;AAAA,EACnC;AACJ;AAEO,IAAM,eAAN,cAA2B,eAAe;AAAA,EAC7C,YACI,MACA,SACA,OAAoB,YAAY,IAChC,sCACF;AACE,UAAM,MAAM,SAAS,MAAM,IAAI;AAAA,EACnC;AACJ;AAKO,IAAM,OAAN,cAAmB,eAAe;AAAA,EACrC,YAAY,MAAoB,UAAoB;AAChD,UAAM,MAAM,MAAM,SAAS,MAAM;AACjC,SAAK,UAAU,IAAI,QAAQ,SAAS,OAAO;AAAA,EAC/C;AACJ;AAEO,IAAM,UAAN,cAAsB,eAAe;AAAA,EACxC,YAAY,MAAoB;AAC5B,UAAM,MAAM,MAAM,YAAY,UAAU;AACxC,SAAK,QAAQ,IAAI,SAAS,KAAK,gBAAgB,CAAC;AAAA,EACpD;AACJ;AAEO,IAAM,YAAN,cAAwB,aAAa;AAAA,EACxC,YACI,MACA,MACU,SACZ;AACE,UAAM,MAAM,CAAC,GAAG,IAAI;AAFV;AAAA,EAGd;AAAA,EAEA,IAAoB,OAAkB;AAClC,WAAO;AAAA,MACH,MAAM,KAAK;AAAA,MACX,OAAO,gBAAgB,KAAK,IAAI;AAAA,MAChC,SAAS,KAAK,WAAW,gBAAgB,KAAK,IAAI;AAAA,IACtD;AAAA,EACJ;AACJ;AAEO,IAAM,aAAN,cAAyB,UAAU;AAAA,EACtC,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,aAAa,MAAM;AAAA,EAC/C;AACJ;AAEO,IAAM,eAAN,cAA2B,UAAU;AAAA,EACxC,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,cAAc,MAAM;AAAA,EAChD;AACJ;AAEO,IAAM,YAAN,cAAwB,UAAU;AAAA,EACrC,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,WAAW,MAAM;AAAA,EAC7C;AACJ;AAEO,IAAM,WAAN,cAAuB,UAAU;AAAA,EACpC,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,WAAW,MAAM;AAAA,EAC7C;AACJ;AAEO,IAAM,mBAAN,cAA+B,UAAU;AAAA,EAC5C,YAAY,MAAoB,QAAgB;AAC5C;AAAA,MACI;AAAA,MACA,YAAY;AAAA,MACZ,GAAG,MAAM;AAAA,IACb;AACA,SAAK,QAAQ,IAAI,SAAS,KAAK,gBAAgB,CAAC;AAAA,EACpD;AAAA,EAEA,IAAoB,OAA0C;AAC1D,WAAO;AAAA,MACH,GAAG,MAAM;AAAA,MACT,SAAS,KAAK,KAAK,gBAAgB;AAAA,IACvC;AAAA,EACJ;AACJ;AAEO,IAAM,sBAAN,cAAkC,UAAU;AAAA,EAC/C,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,uBAAuB,MAAM;AAAA,EACzD;AACJ;AAEO,IAAM,iBAAN,cAA6B,UAAU;AAAA,EAC1C,YAAY,MAAoB;AAC5B,UAAM,MAAM,YAAY,eAAe;AAAA,EAC3C;AACJ;;;AC5NO,IAAe,cAAf,MAAmD;AAAA,EACtD,YACqB,UACA,OAAY,CAAC,GACb,MACnB;AAHmB;AACA;AACA;AAAA,EAClB;AAAA,EAEH,IAAc,UAAmB;AAC7B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAc,MAAW;AACrB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAc,MAAoC;AAC9C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAa,QAA2B;AACpC,QAAI,CAAC,KAAK,UAAU,KAAK,QAAQ,MAAM,GAAG;AACtC,aAAO,KAAK,YAAY,kBAAkB,KAAK,QAAQ,MAAM;AAAA,IACjE;AAEA,QAAI;AACA,aAAO,MAAM,KAAK,SAAS,KAAK,OAAO;AAAA,IAC3C,SAAS,OAAO;AACZ,aAAO,KAAK,YAAY,qBAAqB,OAAO,KAAK,CAAC;AAAA,IAC9D;AAAA,EACJ;AAAA,EAEA,MAAgB,SAAS,SAAqC;AAI1D,UAAM,SAAS,QAAQ;AACvB,UAAM,UAAmD;AAAA,MACrD,KAAK,MAAM,KAAK,IAAI;AAAA,MACpB,KAAK,MAAM,KAAK,IAAI;AAAA,MACpB,MAAM,MAAM,KAAK,KAAK;AAAA,MACtB,OAAO,MAAM,KAAK,MAAM;AAAA,MACxB,QAAQ,MAAM,KAAK,OAAO;AAAA,MAC1B,MAAM,MAAM,KAAK,KAAK;AAAA,MACtB,SAAS,MAAM,KAAK,QAAQ;AAAA,IAChC;AACA,YAAQ,QAAQ,MAAM,MAAM,MAAM,KAAK,YAAY,kBAAkB,MAAM,IAAI;AAAA,EACnF;AAAA,EAEA,MAAgB,MAAyB;AACrC,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEA,MAAgB,MAAyB;AACrC,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEA,MAAgB,OAA0B;AACtC,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEA,MAAgB,QAA2B;AACvC,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEA,MAAgB,SAA4B;AACxC,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEA,MAAgB,UAA6B;AACzC,WAAO,KAAK,YAAY,OAAO;AAAA,EACnC;AAAA,EAEA,MAAgB,OAA0B;AAItC,WAAO,KAAK;AAAA,MACR;AAAA,MACA,MAAM,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,wBAAmB,CAAC,CAAC;AAAA,IACzE;AAAA,EACJ;AAAA,EAEU,YAIN,kBACG,MACK;AACR,WAAO,IAAI,cAAc,MAAM,GAAG,IAAI,EAAE,eAAe;AAAA,EAC3D;AAAA,EAEO,kBAA4B;AAC/B,WAAO,CAAC,GAAG;AAAA,EACf;AAAA,EAEO,kBAA4B;AAC/B,WAAO,4DAAwC;AAAA,EACnD;AAAA,EAEO,UAAU,QAAyB;AACtC,WAAO,SAAS,MAAM,KAAK,KAAK,gBAAgB,EAAE,SAAS,MAAM;AAAA,EACrE;AAAA,EAEO,kBAA4B;AAC/B,WAAO,CAAC,cAAc;AAAA,EAC1B;AAAA,EAEO,YAAoB;AACvB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEO,YAA2B;AAC9B,WAAO,KAAK,QAAQ,QAAQ,IAAI,QAAQ;AAAA,EAC5C;AACJ;;;ACxHO,IAAM,QAAN,MAAY;AAAA,EAGf,YAAY,SAA0C,UAAyB;AAAzB;AAClD,SAAK,UAAU,IAAI,OAAO,OAAO;AAAA,EACrC;AAAA,EAJgB;AAKpB;AAEO,IAAM,SAAN,MAAa;AAAA,EACC,SAAS,oBAAI,IAAqB;AAAA,EAE5C,IAAI,QAAgB,OAAc;AACrC,WAAO,KAAK,QAAQ,QAAQ,MAAM,CAAC,CAAC,EAAE,KAAK,KAAK;AAChD,WAAO;AAAA,EACX;AAAA,EAEO,IAAI,QAAgB,KAAgC;AACvD,UAAM,QAAQ,KAAK,OAAO,IAAI,MAAM;AACpC,QAAI,CAAC,MAAO,QAAO;AAEnB,WAAO,MAAM,KAAK,CAAC,EAAE,QAAQ,MAAM,QAAQ,KAAK,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC;AAAA,EAC1E;AACJ;;;ACvBO,IAAe,eAAf,cAAoC,YAAY;AAAA,EAClC,SAAiB,IAAI,OAAO;AAAA,EAEnC,WAAW,QAAqB;AACtC,WAAO,QAAQ,CAAC,UAAU;AACtB,WAAK,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,IACzC,CAAC;AAAA,EACL;AAAA,EAEU,IAAI,QAAgB,SAAiB,UAAyB;AACpE,SAAK,OAAO,IAAI,QAAQ,IAAI,MAAM,SAAS,QAAQ,CAAC;AACpD,WAAO;AAAA,EACX;AAAA,EAEA,MAAgB,SAAS,SAAqC;AAC1D,UAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ,QAAkB,QAAQ,GAAG;AACnE,QAAI,CAAC,MAAO,QAAO,MAAM,SAAS,OAAO;AAEzC,UAAM,QAAQ,IAAI,IAAI,QAAQ,GAAG,EAAE,SAAS,MAAM,MAAM,OAAO,KAAK,CAAC;AACrE,WAAO,MAAM,SAAS,KAAK,MAAM,GAAG,KAAK;AAAA,EAC7C;AAAA,EAEA,MAAyB,MAAyB;AAC9C,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AAAA,EAEA,MAAyB,MAAyB;AAC9C,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AAAA,EAEA,MAAyB,OAA0B;AAC/C,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AAAA,EAEA,MAAyB,QAA2B;AAChD,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AAAA,EAEA,MAAyB,SAA4B;AACjD,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AACJ;","names":["StatusCodes","Method","MimeType"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adonix.org/cloud-spark",
3
- "version": "0.0.42",
3
+ "version": "0.0.44",
4
4
  "description": "Ignite your Cloudflare Workers with a type-safe library for rapid development.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",