@shware/http 1.2.1 → 1.2.3

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.
Files changed (44) hide show
  1. package/README.md +1 -3
  2. package/dist/__tests__/index.test.cjs.map +1 -1
  3. package/dist/__tests__/index.test.mjs +1 -1
  4. package/dist/__tests__/index.test.mjs.map +1 -1
  5. package/dist/cache/index.cjs +1 -1
  6. package/dist/cache/index.cjs.map +1 -1
  7. package/dist/cache/index.d.cts +5 -5
  8. package/dist/cache/index.d.ts +5 -5
  9. package/dist/cache/index.mjs +1 -1
  10. package/dist/cache/index.mjs.map +1 -1
  11. package/dist/error/status.cjs +0 -3
  12. package/dist/error/status.cjs.map +1 -1
  13. package/dist/error/status.mjs +0 -3
  14. package/dist/error/status.mjs.map +1 -1
  15. package/dist/google-one-tap/index.cjs.map +1 -1
  16. package/dist/google-one-tap/index.mjs.map +1 -1
  17. package/dist/hono/__tests__/authorizer.test.cjs.map +1 -1
  18. package/dist/hono/__tests__/authorizer.test.mjs.map +1 -1
  19. package/dist/hono/__tests__/csrf.test.cjs +166 -0
  20. package/dist/hono/__tests__/csrf.test.cjs.map +1 -1
  21. package/dist/hono/__tests__/csrf.test.mjs +166 -0
  22. package/dist/hono/__tests__/csrf.test.mjs.map +1 -1
  23. package/dist/hono/csrf.cjs +14 -12
  24. package/dist/hono/csrf.cjs.map +1 -1
  25. package/dist/hono/csrf.d.cts +10 -0
  26. package/dist/hono/csrf.d.ts +10 -0
  27. package/dist/hono/csrf.mjs +14 -12
  28. package/dist/hono/csrf.mjs.map +1 -1
  29. package/dist/hono/handler.cjs.map +1 -1
  30. package/dist/hono/handler.mjs +1 -1
  31. package/dist/hono/handler.mjs.map +1 -1
  32. package/dist/hono/validator.cjs.map +1 -1
  33. package/dist/hono/validator.mjs +1 -1
  34. package/dist/hono/validator.mjs.map +1 -1
  35. package/dist/response.cjs.map +1 -1
  36. package/dist/response.mjs +1 -1
  37. package/dist/response.mjs.map +1 -1
  38. package/dist/utils/invariant.cjs.map +1 -1
  39. package/dist/utils/invariant.d.cts +1 -1
  40. package/dist/utils/invariant.d.ts +1 -1
  41. package/dist/utils/invariant.mjs.map +1 -1
  42. package/dist/vaild.cjs.map +1 -1
  43. package/dist/vaild.mjs.map +1 -1
  44. package/package.json +3 -3
package/README.md CHANGED
@@ -1,6 +1,4 @@
1
- # Client Side Error Handling
2
-
3
- # Server Side Error Handling
1
+ # Error Handling
4
2
 
5
3
  ## hono example
6
4
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/__tests__/index.test.ts"],"sourcesContent":["import { Details, DetailType, Status, StatusError } from '../index';\n\ndescribe('error details', () => {\n test('test detail list constructor', () => {\n const details = Details.new()\n .requestInfo({ requestId: '123456', servingData: '/v1/tests' })\n .errorInfo({ reason: 'ACCESS_DENIED' });\n\n expect(details.list).toEqual([\n {\n type: DetailType.REQUEST_INFO,\n requestId: '123456',\n servingData: '/v1/tests',\n },\n {\n type: DetailType.ERROR_INFO,\n reason: 'ACCESS_DENIED',\n },\n ]);\n });\n});\n\ndescribe('error status', () => {\n test('status type', () => {\n const error = Status.invalidArgument().error();\n expect(error instanceof StatusError).toBe(true);\n });\n});\n"],"mappings":";;;AAAA,eAAyD;AAEzD,SAAS,iBAAiB,MAAM;AAC9B,OAAK,gCAAgC,MAAM;AACzC,UAAM,UAAU,iBAAQ,IAAI,EACzB,YAAY,EAAE,WAAW,UAAU,aAAa,YAAY,CAAC,EAC7D,UAAU,EAAE,QAAQ,gBAAgB,CAAC;AAExC,WAAO,QAAQ,IAAI,EAAE,QAAQ;AAAA,MAC3B;AAAA,QACE,MAAM,oBAAW;AAAA,QACjB,WAAW;AAAA,QACX,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,MAAM,oBAAW;AAAA,QACjB,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,MAAM;AAC7B,OAAK,eAAe,MAAM;AACxB,UAAM,QAAQ,gBAAO,gBAAgB,EAAE,MAAM;AAC7C,WAAO,iBAAiB,oBAAW,EAAE,KAAK,IAAI;AAAA,EAChD,CAAC;AACH,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../src/__tests__/index.test.ts"],"sourcesContent":["import { DetailType, Details, Status, StatusError } from '../index';\n\ndescribe('error details', () => {\n test('test detail list constructor', () => {\n const details = Details.new()\n .requestInfo({ requestId: '123456', servingData: '/v1/tests' })\n .errorInfo({ reason: 'ACCESS_DENIED' });\n\n expect(details.list).toEqual([\n {\n type: DetailType.REQUEST_INFO,\n requestId: '123456',\n servingData: '/v1/tests',\n },\n {\n type: DetailType.ERROR_INFO,\n reason: 'ACCESS_DENIED',\n },\n ]);\n });\n});\n\ndescribe('error status', () => {\n test('status type', () => {\n const error = Status.invalidArgument().error();\n expect(error instanceof StatusError).toBe(true);\n });\n});\n"],"mappings":";;;AAAA,eAAyD;AAEzD,SAAS,iBAAiB,MAAM;AAC9B,OAAK,gCAAgC,MAAM;AACzC,UAAM,UAAU,iBAAQ,IAAI,EACzB,YAAY,EAAE,WAAW,UAAU,aAAa,YAAY,CAAC,EAC7D,UAAU,EAAE,QAAQ,gBAAgB,CAAC;AAExC,WAAO,QAAQ,IAAI,EAAE,QAAQ;AAAA,MAC3B;AAAA,QACE,MAAM,oBAAW;AAAA,QACjB,WAAW;AAAA,QACX,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,MAAM,oBAAW;AAAA,QACjB,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,MAAM;AAC7B,OAAK,eAAe,MAAM;AACxB,UAAM,QAAQ,gBAAO,gBAAgB,EAAE,MAAM;AAC7C,WAAO,iBAAiB,oBAAW,EAAE,KAAK,IAAI;AAAA,EAChD,CAAC;AACH,CAAC;","names":[]}
@@ -1,5 +1,5 @@
1
1
  // src/__tests__/index.test.ts
2
- import { Details, DetailType, Status, StatusError } from "../index.mjs";
2
+ import { DetailType, Details, Status, StatusError } from "../index.mjs";
3
3
  describe("error details", () => {
4
4
  test("test detail list constructor", () => {
5
5
  const details = Details.new().requestInfo({ requestId: "123456", servingData: "/v1/tests" }).errorInfo({ reason: "ACCESS_DENIED" });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/__tests__/index.test.ts"],"sourcesContent":["import { Details, DetailType, Status, StatusError } from '../index';\n\ndescribe('error details', () => {\n test('test detail list constructor', () => {\n const details = Details.new()\n .requestInfo({ requestId: '123456', servingData: '/v1/tests' })\n .errorInfo({ reason: 'ACCESS_DENIED' });\n\n expect(details.list).toEqual([\n {\n type: DetailType.REQUEST_INFO,\n requestId: '123456',\n servingData: '/v1/tests',\n },\n {\n type: DetailType.ERROR_INFO,\n reason: 'ACCESS_DENIED',\n },\n ]);\n });\n});\n\ndescribe('error status', () => {\n test('status type', () => {\n const error = Status.invalidArgument().error();\n expect(error instanceof StatusError).toBe(true);\n });\n});\n"],"mappings":";AAAA,SAAS,SAAS,YAAY,QAAQ,mBAAmB;AAEzD,SAAS,iBAAiB,MAAM;AAC9B,OAAK,gCAAgC,MAAM;AACzC,UAAM,UAAU,QAAQ,IAAI,EACzB,YAAY,EAAE,WAAW,UAAU,aAAa,YAAY,CAAC,EAC7D,UAAU,EAAE,QAAQ,gBAAgB,CAAC;AAExC,WAAO,QAAQ,IAAI,EAAE,QAAQ;AAAA,MAC3B;AAAA,QACE,MAAM,WAAW;AAAA,QACjB,WAAW;AAAA,QACX,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,MAAM,WAAW;AAAA,QACjB,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,MAAM;AAC7B,OAAK,eAAe,MAAM;AACxB,UAAM,QAAQ,OAAO,gBAAgB,EAAE,MAAM;AAC7C,WAAO,iBAAiB,WAAW,EAAE,KAAK,IAAI;AAAA,EAChD,CAAC;AACH,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../src/__tests__/index.test.ts"],"sourcesContent":["import { DetailType, Details, Status, StatusError } from '../index';\n\ndescribe('error details', () => {\n test('test detail list constructor', () => {\n const details = Details.new()\n .requestInfo({ requestId: '123456', servingData: '/v1/tests' })\n .errorInfo({ reason: 'ACCESS_DENIED' });\n\n expect(details.list).toEqual([\n {\n type: DetailType.REQUEST_INFO,\n requestId: '123456',\n servingData: '/v1/tests',\n },\n {\n type: DetailType.ERROR_INFO,\n reason: 'ACCESS_DENIED',\n },\n ]);\n });\n});\n\ndescribe('error status', () => {\n test('status type', () => {\n const error = Status.invalidArgument().error();\n expect(error instanceof StatusError).toBe(true);\n });\n});\n"],"mappings":";AAAA,SAAS,YAAY,SAAS,QAAQ,mBAAmB;AAEzD,SAAS,iBAAiB,MAAM;AAC9B,OAAK,gCAAgC,MAAM;AACzC,UAAM,UAAU,QAAQ,IAAI,EACzB,YAAY,EAAE,WAAW,UAAU,aAAa,YAAY,CAAC,EAC7D,UAAU,EAAE,QAAQ,gBAAgB,CAAC;AAExC,WAAO,QAAQ,IAAI,EAAE,QAAQ;AAAA,MAC3B;AAAA,QACE,MAAM,WAAW;AAAA,QACjB,WAAW;AAAA,QACX,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,MAAM,WAAW;AAAA,QACjB,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,MAAM;AAC7B,OAAK,eAAe,MAAM;AACxB,UAAM,QAAQ,OAAO,gBAAgB,EAAE,MAAM;AAC7C,WAAO,iBAAiB,WAAW,EAAE,KAAK,IAAI;AAAA,EAChD,CAAC;AACH,CAAC;","names":[]}
@@ -23,7 +23,7 @@ __export(cache_exports, {
23
23
  cache: () => cache
24
24
  });
25
25
  module.exports = __toCommonJS(cache_exports);
26
- function cache(props) {
26
+ function cache(_props) {
27
27
  }
28
28
  // Annotate the CommonJS export names for ESM import in node:
29
29
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cache/index.ts"],"sourcesContent":["interface Props<T extends (...args: any[]) => any> {\n name: string;\n key: (...args: Parameters<T>) => string;\n condition?: (...args: Parameters<T>) => boolean;\n fn: T;\n}\n\nexport function cache<T extends (...args: any[]) => any>(props: Props<T>) {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,SAAS,MAAyC,OAAiB;AAAC;","names":[]}
1
+ {"version":3,"sources":["../../src/cache/index.ts"],"sourcesContent":["interface Props<A extends unknown[], R> {\n name: string;\n key: (...args: A) => string;\n fn: (...args: A) => R;\n condition?: (...args: A) => boolean;\n}\n\nexport function cache<A extends unknown[], R>(_props: Props<A, R>) {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,SAAS,MAA8B,QAAqB;AAAC;","names":[]}
@@ -1,9 +1,9 @@
1
- interface Props<T extends (...args: any[]) => any> {
1
+ interface Props<A extends unknown[], R> {
2
2
  name: string;
3
- key: (...args: Parameters<T>) => string;
4
- condition?: (...args: Parameters<T>) => boolean;
5
- fn: T;
3
+ key: (...args: A) => string;
4
+ fn: (...args: A) => R;
5
+ condition?: (...args: A) => boolean;
6
6
  }
7
- declare function cache<T extends (...args: any[]) => any>(props: Props<T>): void;
7
+ declare function cache<A extends unknown[], R>(_props: Props<A, R>): void;
8
8
 
9
9
  export { cache };
@@ -1,9 +1,9 @@
1
- interface Props<T extends (...args: any[]) => any> {
1
+ interface Props<A extends unknown[], R> {
2
2
  name: string;
3
- key: (...args: Parameters<T>) => string;
4
- condition?: (...args: Parameters<T>) => boolean;
5
- fn: T;
3
+ key: (...args: A) => string;
4
+ fn: (...args: A) => R;
5
+ condition?: (...args: A) => boolean;
6
6
  }
7
- declare function cache<T extends (...args: any[]) => any>(props: Props<T>): void;
7
+ declare function cache<A extends unknown[], R>(_props: Props<A, R>): void;
8
8
 
9
9
  export { cache };
@@ -1,5 +1,5 @@
1
1
  // src/cache/index.ts
2
- function cache(props) {
2
+ function cache(_props) {
3
3
  }
4
4
  export {
5
5
  cache
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cache/index.ts"],"sourcesContent":["interface Props<T extends (...args: any[]) => any> {\n name: string;\n key: (...args: Parameters<T>) => string;\n condition?: (...args: Parameters<T>) => boolean;\n fn: T;\n}\n\nexport function cache<T extends (...args: any[]) => any>(props: Props<T>) {}\n"],"mappings":";AAOO,SAAS,MAAyC,OAAiB;AAAC;","names":[]}
1
+ {"version":3,"sources":["../../src/cache/index.ts"],"sourcesContent":["interface Props<A extends unknown[], R> {\n name: string;\n key: (...args: A) => string;\n fn: (...args: A) => R;\n condition?: (...args: A) => boolean;\n}\n\nexport function cache<A extends unknown[], R>(_props: Props<A, R>) {}\n"],"mappings":";AAOO,SAAS,MAA8B,QAAqB;AAAC;","names":[]}
@@ -198,9 +198,6 @@ var StatusError = class _StatusError extends Error {
198
198
  this.name = "StatusError";
199
199
  this.status = status;
200
200
  this.body = body;
201
- if (Error.captureStackTrace) {
202
- Error.captureStackTrace(this, _StatusError);
203
- }
204
201
  Object.setPrototypeOf(this, _StatusError.prototype);
205
202
  }
206
203
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/error/status.ts"],"sourcesContent":["import type { Detail, Details } from './detail';\n\nexport const Code = {\n // Not an error; returned on success\n //\n // HTTP Mapping: 200 OK\n OK: 200,\n\n // The operation was cancelled, typically by the caller.\n //\n // HTTP Mapping: 499 Client Closed Request\n CANCELLED: 499,\n\n // Unknown error. For example, this error may be returned when\n // a `Status` value received from another address space belongs to\n // an error space that is not known in this address space. Also,\n // errors raised by APIs that do not return enough error information\n // may be converted to this error.\n //\n // HTTP Mapping: 500 Internal Server Error\n UNKNOWN: 500,\n\n // The client specified an invalid argument. Note that this differs\n // from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments\n // that are problematic regardless of the state of the system\n // (e.g., a malformed file name).\n //\n // HTTP Mapping: 400 Bad Request\n INVALID_ARGUMENT: 400,\n\n // The deadline expired before the operation could complete. For operations\n // that change the state of the system, this error may be returned\n // even if the operation has completed successfully. For example, a\n // successful response from a server could have been delayed long\n // enough for the deadline to expire.\n //\n // HTTP Mapping: 504 Gateway Timeout\n DEADLINE_EXCEEDED: 504,\n\n // Some requested entity (e.g., file or directory) was not found.\n //\n // Note to server developers: if a request is denied for an entire class\n // of users, such as gradual feature rollout or undocumented whitelist,\n // `NOT_FOUND` may be used. If a request is denied for some users within\n // a class of users, such as user-based access control, `PERMISSION_DENIED`\n // must be used.\n //\n // HTTP Mapping: 404 Not Found\n NOT_FOUND: 404,\n\n // The entity that a client attempted to create (e.g., file or directory)\n // already exists.\n //\n // HTTP Mapping: 409 Conflict\n ALREADY_EXISTS: 409,\n\n // The caller does not have permission to execute the specified\n // operation. `PERMISSION_DENIED` must not be used for rejections\n // caused by exhausting some resource (use `RESOURCE_EXHAUSTED`\n // instead for those errors). `PERMISSION_DENIED` must not be\n // used if the caller can not be identified (use `UNAUTHENTICATED`\n // instead for those errors). This error code does not imply the\n // request is valid or the requested entity exists or satisfies\n // other pre-conditions.\n //\n // HTTP Mapping: 403 Forbidden\n PERMISSION_DENIED: 403,\n\n // Some resource has been exhausted, perhaps a per-user quota, or\n // perhaps the entire file system is out of space.\n //\n // HTTP Mapping: 429 Too Many Requests\n RESOURCE_EXHAUSTED: 429,\n\n // The operation was rejected because the system is not in a state\n // required for the operation's execution. For example, the directory\n // to be deleted is non-empty, a rmdir operation is applied to\n // a non-directory, etc.\n //\n // Service implementors can use the following guidelines to decide\n // between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`:\n // (a) Use `UNAVAILABLE` if the client can retry just the failing call.\n // (b) Use `ABORTED` if the client should retry at a higher level\n // (e.g., when a client-specified test-and-set fails, indicating the\n // client should restart a read-modify-write sequence).\n // (c) Use `FAILED_PRECONDITION` if the client should not retry until\n // the system state has been explicitly fixed. E.g., if a \"rmdir\"\n // fails because the directory is non-empty, `FAILED_PRECONDITION`\n // should be returned since the client should not retry unless\n // the files are deleted from the directory.\n //\n // HTTP Mapping: 400 Bad Request\n FAILED_PRECONDITION: 400,\n\n // The operation was aborted, typically due to a concurrency issue such as\n // a sequencer check failure or transaction abort.\n //\n // See the guidelines above for deciding between `FAILED_PRECONDITION`,\n // `ABORTED`, and `UNAVAILABLE`.\n //\n // HTTP Mapping: 409 Conflict\n ABORTED: 409,\n\n // The operation was attempted past the valid range. E.g., seeking or\n // reading past end-of-file.\n //\n // Unlike `INVALID_ARGUMENT`, this error indicates a problem that may\n // be fixed if the system state changes. For example, a 32-bit file\n // system will generate `INVALID_ARGUMENT` if asked to read at an\n // offset that is not in the range [0,2^32-1], but it will generate\n // `OUT_OF_RANGE` if asked to read from an offset past the current\n // file size.\n //\n // There is a fair bit of overlap between `FAILED_PRECONDITION` and\n // `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific\n // error) when it applies so that callers who are iterating through\n // a space can easily look for an `OUT_OF_RANGE` error to detect when\n // they are done.\n //\n // HTTP Mapping: 400 Bad Request\n OUT_OF_RANGE: 400,\n\n // The operation is not implemented or is not supported/enabled in this\n // service.\n //\n // HTTP Mapping: 501 Not Implemented\n UNIMPLEMENTED: 501,\n\n // Internal errors. This means that some invariants expected by the\n // underlying system have been broken. This error code is reserved\n // for serious errors.\n //\n // HTTP Mapping: 500 Internal Server Error\n INTERNAL: 500,\n\n // The service is currently unavailable. This is most likely a\n // transient condition, which can be corrected by retrying with\n // a backoff. Note that it is not always safe to retry\n // non-idempotent operations.\n //\n // See the guidelines above for deciding between `FAILED_PRECONDITION`,\n // `ABORTED`, and `UNAVAILABLE`.\n //\n // HTTP Mapping: 503 Service Unavailable\n UNAVAILABLE: 503,\n\n // Unrecoverable data loss or corruption.\n //\n // HTTP Mapping: 500 Internal Server Error\n DATA_LOSS: 500,\n\n // The request does not have valid authentication credentials for the\n // operation.\n //\n // HTTP Mapping: 401 Unauthorized\n UNAUTHENTICATED: 401,\n\n // The request method is not supported by the server and cannot be handled.\n //\n // HTTP Mapping: 405 Method Not Allowed\n METHOD_NOT_ALLOWED: 405,\n} as const;\n\nexport const DEFAULT_MESSAGES: Record<keyof typeof Code, string> = {\n OK: 'OK',\n CANCELLED: 'The operation was cancelled',\n UNKNOWN: 'Unknown error',\n INVALID_ARGUMENT: 'The client specified an invalid argument',\n DEADLINE_EXCEEDED: 'The deadline expired before the operation could complete',\n NOT_FOUND: 'Some requested entity was not found',\n ALREADY_EXISTS: 'The entity that a client attempted to create already exists',\n PERMISSION_DENIED: 'The caller does not have permission to execute the specified operation',\n RESOURCE_EXHAUSTED: 'Some resource has been exhausted',\n FAILED_PRECONDITION:\n \"The operation was rejected because the system is not in a state required for the operation's execution\",\n ABORTED: 'The operation was aborted',\n OUT_OF_RANGE: 'The operation was attempted past the valid range',\n UNIMPLEMENTED: 'The operation is not implemented or is not supported/enabled in this service',\n INTERNAL: 'Internal errors',\n UNAVAILABLE: 'The service is currently unavailable',\n DATA_LOSS: 'Unrecoverable data loss or corruption',\n UNAUTHENTICATED: 'The request does not have valid authentication credentials for the operation',\n METHOD_NOT_ALLOWED: 'The request method is not supported by the server and cannot be handled',\n};\n\nexport interface ErrorBody {\n error: {\n code: number;\n status: keyof typeof Code;\n message: string;\n details: Detail[];\n };\n}\n\nexport class StatusError extends Error {\n readonly status: number;\n readonly body?: ErrorBody;\n\n constructor(status: number, body?: ErrorBody) {\n super(body?.error?.message ?? `Status Error: ${status}`);\n this.name = 'StatusError';\n this.status = status;\n this.body = body;\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, StatusError);\n }\n Object.setPrototypeOf(this, StatusError.prototype);\n }\n}\n\nexport class StatusCode {\n code: keyof typeof Code;\n message?: string;\n private constructor(code: keyof typeof Code, message?: string) {\n this.code = code;\n this.message = message;\n }\n\n static of(code: keyof typeof Code, message?: string) {\n return new StatusCode(code, message ?? DEFAULT_MESSAGES[code]);\n }\n\n body(details?: Details): ErrorBody {\n return {\n error: {\n code: Code[this.code],\n status: this.code,\n message: this.message ?? '',\n details: details?.list ?? [],\n },\n };\n }\n\n error(details?: Details): Error {\n const body = this.body(details);\n if (Status.adapter) return Status.adapter(Code[this.code], body);\n return new StatusError(Code[this.code], body);\n }\n\n response(details?: Details): Response {\n const body = this.body(details);\n return Response.json(body, { status: body.error.code });\n }\n}\n\nexport class Status {\n static adapter?: (status: number, response: ErrorBody) => Error;\n\n static ok = (message?: string) => StatusCode.of('OK', message);\n static cancelled = (message?: string) => StatusCode.of('CANCELLED', message);\n static unknown = (message?: string) => StatusCode.of('UNKNOWN', message);\n static invalidArgument = (message?: string) => StatusCode.of('INVALID_ARGUMENT', message);\n static deadlineExceeded = (message?: string) => StatusCode.of('DEADLINE_EXCEEDED', message);\n static notFound = (message?: string) => StatusCode.of('NOT_FOUND', message);\n static alreadyExists = (message?: string) => StatusCode.of('ALREADY_EXISTS', message);\n static permissionDenied = (message?: string) => StatusCode.of('PERMISSION_DENIED', message);\n static unauthorized = (message?: string) => StatusCode.of('UNAUTHENTICATED', message);\n static resourceExhausted = (message?: string) => StatusCode.of('RESOURCE_EXHAUSTED', message);\n static failedPrecondition = (message?: string) => StatusCode.of('FAILED_PRECONDITION', message);\n static aborted = (message?: string) => StatusCode.of('ABORTED', message);\n static outOfRange = (message?: string) => StatusCode.of('OUT_OF_RANGE', message);\n static unimplemented = (message?: string) => StatusCode.of('UNIMPLEMENTED', message);\n static internal = (message?: string) => StatusCode.of('INTERNAL', message);\n static unavailable = (message?: string) => StatusCode.of('UNAVAILABLE', message);\n static dataLoss = (message?: string) => StatusCode.of('DATA_LOSS', message);\n static methodNotAllowed = (message?: string) => StatusCode.of('METHOD_NOT_ALLOWED', message);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/error/status.ts"],"sourcesContent":["import type { Detail, Details } from './detail';\n\nexport const Code = {\n // Not an error; returned on success\n //\n // HTTP Mapping: 200 OK\n OK: 200,\n\n // The operation was cancelled, typically by the caller.\n //\n // HTTP Mapping: 499 Client Closed Request\n CANCELLED: 499,\n\n // Unknown error. For example, this error may be returned when\n // a `Status` value received from another address space belongs to\n // an error space that is not known in this address space. Also,\n // errors raised by APIs that do not return enough error information\n // may be converted to this error.\n //\n // HTTP Mapping: 500 Internal Server Error\n UNKNOWN: 500,\n\n // The client specified an invalid argument. Note that this differs\n // from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments\n // that are problematic regardless of the state of the system\n // (e.g., a malformed file name).\n //\n // HTTP Mapping: 400 Bad Request\n INVALID_ARGUMENT: 400,\n\n // The deadline expired before the operation could complete. For operations\n // that change the state of the system, this error may be returned\n // even if the operation has completed successfully. For example, a\n // successful response from a server could have been delayed long\n // enough for the deadline to expire.\n //\n // HTTP Mapping: 504 Gateway Timeout\n DEADLINE_EXCEEDED: 504,\n\n // Some requested entity (e.g., file or directory) was not found.\n //\n // Note to server developers: if a request is denied for an entire class\n // of users, such as gradual feature rollout or undocumented whitelist,\n // `NOT_FOUND` may be used. If a request is denied for some users within\n // a class of users, such as user-based access control, `PERMISSION_DENIED`\n // must be used.\n //\n // HTTP Mapping: 404 Not Found\n NOT_FOUND: 404,\n\n // The entity that a client attempted to create (e.g., file or directory)\n // already exists.\n //\n // HTTP Mapping: 409 Conflict\n ALREADY_EXISTS: 409,\n\n // The caller does not have permission to execute the specified\n // operation. `PERMISSION_DENIED` must not be used for rejections\n // caused by exhausting some resource (use `RESOURCE_EXHAUSTED`\n // instead for those errors). `PERMISSION_DENIED` must not be\n // used if the caller can not be identified (use `UNAUTHENTICATED`\n // instead for those errors). This error code does not imply the\n // request is valid or the requested entity exists or satisfies\n // other pre-conditions.\n //\n // HTTP Mapping: 403 Forbidden\n PERMISSION_DENIED: 403,\n\n // Some resource has been exhausted, perhaps a per-user quota, or\n // perhaps the entire file system is out of space.\n //\n // HTTP Mapping: 429 Too Many Requests\n RESOURCE_EXHAUSTED: 429,\n\n // The operation was rejected because the system is not in a state\n // required for the operation's execution. For example, the directory\n // to be deleted is non-empty, a rmdir operation is applied to\n // a non-directory, etc.\n //\n // Service implementors can use the following guidelines to decide\n // between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`:\n // (a) Use `UNAVAILABLE` if the client can retry just the failing call.\n // (b) Use `ABORTED` if the client should retry at a higher level\n // (e.g., when a client-specified test-and-set fails, indicating the\n // client should restart a read-modify-write sequence).\n // (c) Use `FAILED_PRECONDITION` if the client should not retry until\n // the system state has been explicitly fixed. E.g., if a \"rmdir\"\n // fails because the directory is non-empty, `FAILED_PRECONDITION`\n // should be returned since the client should not retry unless\n // the files are deleted from the directory.\n //\n // HTTP Mapping: 400 Bad Request\n FAILED_PRECONDITION: 400,\n\n // The operation was aborted, typically due to a concurrency issue such as\n // a sequencer check failure or transaction abort.\n //\n // See the guidelines above for deciding between `FAILED_PRECONDITION`,\n // `ABORTED`, and `UNAVAILABLE`.\n //\n // HTTP Mapping: 409 Conflict\n ABORTED: 409,\n\n // The operation was attempted past the valid range. E.g., seeking or\n // reading past end-of-file.\n //\n // Unlike `INVALID_ARGUMENT`, this error indicates a problem that may\n // be fixed if the system state changes. For example, a 32-bit file\n // system will generate `INVALID_ARGUMENT` if asked to read at an\n // offset that is not in the range [0,2^32-1], but it will generate\n // `OUT_OF_RANGE` if asked to read from an offset past the current\n // file size.\n //\n // There is a fair bit of overlap between `FAILED_PRECONDITION` and\n // `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific\n // error) when it applies so that callers who are iterating through\n // a space can easily look for an `OUT_OF_RANGE` error to detect when\n // they are done.\n //\n // HTTP Mapping: 400 Bad Request\n OUT_OF_RANGE: 400,\n\n // The operation is not implemented or is not supported/enabled in this\n // service.\n //\n // HTTP Mapping: 501 Not Implemented\n UNIMPLEMENTED: 501,\n\n // Internal errors. This means that some invariants expected by the\n // underlying system have been broken. This error code is reserved\n // for serious errors.\n //\n // HTTP Mapping: 500 Internal Server Error\n INTERNAL: 500,\n\n // The service is currently unavailable. This is most likely a\n // transient condition, which can be corrected by retrying with\n // a backoff. Note that it is not always safe to retry\n // non-idempotent operations.\n //\n // See the guidelines above for deciding between `FAILED_PRECONDITION`,\n // `ABORTED`, and `UNAVAILABLE`.\n //\n // HTTP Mapping: 503 Service Unavailable\n UNAVAILABLE: 503,\n\n // Unrecoverable data loss or corruption.\n //\n // HTTP Mapping: 500 Internal Server Error\n DATA_LOSS: 500,\n\n // The request does not have valid authentication credentials for the\n // operation.\n //\n // HTTP Mapping: 401 Unauthorized\n UNAUTHENTICATED: 401,\n\n // The request method is not supported by the server and cannot be handled.\n //\n // HTTP Mapping: 405 Method Not Allowed\n METHOD_NOT_ALLOWED: 405,\n} as const;\n\nexport const DEFAULT_MESSAGES: Record<keyof typeof Code, string> = {\n OK: 'OK',\n CANCELLED: 'The operation was cancelled',\n UNKNOWN: 'Unknown error',\n INVALID_ARGUMENT: 'The client specified an invalid argument',\n DEADLINE_EXCEEDED: 'The deadline expired before the operation could complete',\n NOT_FOUND: 'Some requested entity was not found',\n ALREADY_EXISTS: 'The entity that a client attempted to create already exists',\n PERMISSION_DENIED: 'The caller does not have permission to execute the specified operation',\n RESOURCE_EXHAUSTED: 'Some resource has been exhausted',\n FAILED_PRECONDITION:\n \"The operation was rejected because the system is not in a state required for the operation's execution\",\n ABORTED: 'The operation was aborted',\n OUT_OF_RANGE: 'The operation was attempted past the valid range',\n UNIMPLEMENTED: 'The operation is not implemented or is not supported/enabled in this service',\n INTERNAL: 'Internal errors',\n UNAVAILABLE: 'The service is currently unavailable',\n DATA_LOSS: 'Unrecoverable data loss or corruption',\n UNAUTHENTICATED: 'The request does not have valid authentication credentials for the operation',\n METHOD_NOT_ALLOWED: 'The request method is not supported by the server and cannot be handled',\n};\n\nexport interface ErrorBody {\n error: {\n code: number;\n status: keyof typeof Code;\n message: string;\n details: Detail[];\n };\n}\n\nexport class StatusError extends Error {\n readonly status: number;\n readonly body?: ErrorBody;\n\n constructor(status: number, body?: ErrorBody) {\n super(body?.error?.message ?? `Status Error: ${status}`);\n this.name = 'StatusError';\n this.status = status;\n this.body = body;\n Object.setPrototypeOf(this, StatusError.prototype);\n }\n}\n\nexport class StatusCode {\n code: keyof typeof Code;\n message?: string;\n private constructor(code: keyof typeof Code, message?: string) {\n this.code = code;\n this.message = message;\n }\n\n static of(code: keyof typeof Code, message?: string) {\n return new StatusCode(code, message ?? DEFAULT_MESSAGES[code]);\n }\n\n body(details?: Details): ErrorBody {\n return {\n error: {\n code: Code[this.code],\n status: this.code,\n message: this.message ?? '',\n details: details?.list ?? [],\n },\n };\n }\n\n error(details?: Details): Error {\n const body = this.body(details);\n if (Status.adapter) return Status.adapter(Code[this.code], body);\n return new StatusError(Code[this.code], body);\n }\n\n response(details?: Details): Response {\n const body = this.body(details);\n return Response.json(body, { status: body.error.code });\n }\n}\n\nexport class Status {\n static adapter?: (status: number, response: ErrorBody) => Error;\n\n static ok = (message?: string) => StatusCode.of('OK', message);\n static cancelled = (message?: string) => StatusCode.of('CANCELLED', message);\n static unknown = (message?: string) => StatusCode.of('UNKNOWN', message);\n static invalidArgument = (message?: string) => StatusCode.of('INVALID_ARGUMENT', message);\n static deadlineExceeded = (message?: string) => StatusCode.of('DEADLINE_EXCEEDED', message);\n static notFound = (message?: string) => StatusCode.of('NOT_FOUND', message);\n static alreadyExists = (message?: string) => StatusCode.of('ALREADY_EXISTS', message);\n static permissionDenied = (message?: string) => StatusCode.of('PERMISSION_DENIED', message);\n static unauthorized = (message?: string) => StatusCode.of('UNAUTHENTICATED', message);\n static resourceExhausted = (message?: string) => StatusCode.of('RESOURCE_EXHAUSTED', message);\n static failedPrecondition = (message?: string) => StatusCode.of('FAILED_PRECONDITION', message);\n static aborted = (message?: string) => StatusCode.of('ABORTED', message);\n static outOfRange = (message?: string) => StatusCode.of('OUT_OF_RANGE', message);\n static unimplemented = (message?: string) => StatusCode.of('UNIMPLEMENTED', message);\n static internal = (message?: string) => StatusCode.of('INTERNAL', message);\n static unavailable = (message?: string) => StatusCode.of('UNAVAILABLE', message);\n static dataLoss = (message?: string) => StatusCode.of('DATA_LOSS', message);\n static methodNotAllowed = (message?: string) => StatusCode.of('METHOD_NOT_ALLOWED', message);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,OAAO;AAAA;AAAA;AAAA;AAAA,EAIlB,IAAI;AAAA;AAAA;AAAA;AAAA,EAKJ,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASX,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQT,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASlB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWnB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYhB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnB,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBpB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASrB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBT,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAMd,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWV,aAAa;AAAA;AAAA;AAAA;AAAA,EAKb,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAKjB,oBAAoB;AACtB;AAEO,IAAM,mBAAsD;AAAA,EACjE,IAAI;AAAA,EACJ,WAAW;AAAA,EACX,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,qBACE;AAAA,EACF,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,UAAU;AAAA,EACV,aAAa;AAAA,EACb,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,oBAAoB;AACtB;AAWO,IAAM,cAAN,MAAM,qBAAoB,MAAM;AAAA,EAC5B;AAAA,EACA;AAAA,EAET,YAAY,QAAgB,MAAkB;AAC5C,UAAM,MAAM,OAAO,WAAW,iBAAiB,MAAM,EAAE;AACvD,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,aAAY,SAAS;AAAA,EACnD;AACF;AAEO,IAAM,aAAN,MAAM,YAAW;AAAA,EACtB;AAAA,EACA;AAAA,EACQ,YAAY,MAAyB,SAAkB;AAC7D,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,GAAG,MAAyB,SAAkB;AACnD,WAAO,IAAI,YAAW,MAAM,WAAW,iBAAiB,IAAI,CAAC;AAAA,EAC/D;AAAA,EAEA,KAAK,SAA8B;AACjC,WAAO;AAAA,MACL,OAAO;AAAA,QACL,MAAM,KAAK,KAAK,IAAI;AAAA,QACpB,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK,WAAW;AAAA,QACzB,SAAS,SAAS,QAAQ,CAAC;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAA0B;AAC9B,UAAM,OAAO,KAAK,KAAK,OAAO;AAC9B,QAAI,OAAO,QAAS,QAAO,OAAO,QAAQ,KAAK,KAAK,IAAI,GAAG,IAAI;AAC/D,WAAO,IAAI,YAAY,KAAK,KAAK,IAAI,GAAG,IAAI;AAAA,EAC9C;AAAA,EAEA,SAAS,SAA6B;AACpC,UAAM,OAAO,KAAK,KAAK,OAAO;AAC9B,WAAO,SAAS,KAAK,MAAM,EAAE,QAAQ,KAAK,MAAM,KAAK,CAAC;AAAA,EACxD;AACF;AAEO,IAAM,SAAN,MAAa;AAAA,EAClB,OAAO;AAAA,EAEP,OAAO,KAAK,CAAC,YAAqB,WAAW,GAAG,MAAM,OAAO;AAAA,EAC7D,OAAO,YAAY,CAAC,YAAqB,WAAW,GAAG,aAAa,OAAO;AAAA,EAC3E,OAAO,UAAU,CAAC,YAAqB,WAAW,GAAG,WAAW,OAAO;AAAA,EACvE,OAAO,kBAAkB,CAAC,YAAqB,WAAW,GAAG,oBAAoB,OAAO;AAAA,EACxF,OAAO,mBAAmB,CAAC,YAAqB,WAAW,GAAG,qBAAqB,OAAO;AAAA,EAC1F,OAAO,WAAW,CAAC,YAAqB,WAAW,GAAG,aAAa,OAAO;AAAA,EAC1E,OAAO,gBAAgB,CAAC,YAAqB,WAAW,GAAG,kBAAkB,OAAO;AAAA,EACpF,OAAO,mBAAmB,CAAC,YAAqB,WAAW,GAAG,qBAAqB,OAAO;AAAA,EAC1F,OAAO,eAAe,CAAC,YAAqB,WAAW,GAAG,mBAAmB,OAAO;AAAA,EACpF,OAAO,oBAAoB,CAAC,YAAqB,WAAW,GAAG,sBAAsB,OAAO;AAAA,EAC5F,OAAO,qBAAqB,CAAC,YAAqB,WAAW,GAAG,uBAAuB,OAAO;AAAA,EAC9F,OAAO,UAAU,CAAC,YAAqB,WAAW,GAAG,WAAW,OAAO;AAAA,EACvE,OAAO,aAAa,CAAC,YAAqB,WAAW,GAAG,gBAAgB,OAAO;AAAA,EAC/E,OAAO,gBAAgB,CAAC,YAAqB,WAAW,GAAG,iBAAiB,OAAO;AAAA,EACnF,OAAO,WAAW,CAAC,YAAqB,WAAW,GAAG,YAAY,OAAO;AAAA,EACzE,OAAO,cAAc,CAAC,YAAqB,WAAW,GAAG,eAAe,OAAO;AAAA,EAC/E,OAAO,WAAW,CAAC,YAAqB,WAAW,GAAG,aAAa,OAAO;AAAA,EAC1E,OAAO,mBAAmB,CAAC,YAAqB,WAAW,GAAG,sBAAsB,OAAO;AAC7F;","names":[]}
@@ -170,9 +170,6 @@ var StatusError = class _StatusError extends Error {
170
170
  this.name = "StatusError";
171
171
  this.status = status;
172
172
  this.body = body;
173
- if (Error.captureStackTrace) {
174
- Error.captureStackTrace(this, _StatusError);
175
- }
176
173
  Object.setPrototypeOf(this, _StatusError.prototype);
177
174
  }
178
175
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/error/status.ts"],"sourcesContent":["import type { Detail, Details } from './detail';\n\nexport const Code = {\n // Not an error; returned on success\n //\n // HTTP Mapping: 200 OK\n OK: 200,\n\n // The operation was cancelled, typically by the caller.\n //\n // HTTP Mapping: 499 Client Closed Request\n CANCELLED: 499,\n\n // Unknown error. For example, this error may be returned when\n // a `Status` value received from another address space belongs to\n // an error space that is not known in this address space. Also,\n // errors raised by APIs that do not return enough error information\n // may be converted to this error.\n //\n // HTTP Mapping: 500 Internal Server Error\n UNKNOWN: 500,\n\n // The client specified an invalid argument. Note that this differs\n // from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments\n // that are problematic regardless of the state of the system\n // (e.g., a malformed file name).\n //\n // HTTP Mapping: 400 Bad Request\n INVALID_ARGUMENT: 400,\n\n // The deadline expired before the operation could complete. For operations\n // that change the state of the system, this error may be returned\n // even if the operation has completed successfully. For example, a\n // successful response from a server could have been delayed long\n // enough for the deadline to expire.\n //\n // HTTP Mapping: 504 Gateway Timeout\n DEADLINE_EXCEEDED: 504,\n\n // Some requested entity (e.g., file or directory) was not found.\n //\n // Note to server developers: if a request is denied for an entire class\n // of users, such as gradual feature rollout or undocumented whitelist,\n // `NOT_FOUND` may be used. If a request is denied for some users within\n // a class of users, such as user-based access control, `PERMISSION_DENIED`\n // must be used.\n //\n // HTTP Mapping: 404 Not Found\n NOT_FOUND: 404,\n\n // The entity that a client attempted to create (e.g., file or directory)\n // already exists.\n //\n // HTTP Mapping: 409 Conflict\n ALREADY_EXISTS: 409,\n\n // The caller does not have permission to execute the specified\n // operation. `PERMISSION_DENIED` must not be used for rejections\n // caused by exhausting some resource (use `RESOURCE_EXHAUSTED`\n // instead for those errors). `PERMISSION_DENIED` must not be\n // used if the caller can not be identified (use `UNAUTHENTICATED`\n // instead for those errors). This error code does not imply the\n // request is valid or the requested entity exists or satisfies\n // other pre-conditions.\n //\n // HTTP Mapping: 403 Forbidden\n PERMISSION_DENIED: 403,\n\n // Some resource has been exhausted, perhaps a per-user quota, or\n // perhaps the entire file system is out of space.\n //\n // HTTP Mapping: 429 Too Many Requests\n RESOURCE_EXHAUSTED: 429,\n\n // The operation was rejected because the system is not in a state\n // required for the operation's execution. For example, the directory\n // to be deleted is non-empty, a rmdir operation is applied to\n // a non-directory, etc.\n //\n // Service implementors can use the following guidelines to decide\n // between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`:\n // (a) Use `UNAVAILABLE` if the client can retry just the failing call.\n // (b) Use `ABORTED` if the client should retry at a higher level\n // (e.g., when a client-specified test-and-set fails, indicating the\n // client should restart a read-modify-write sequence).\n // (c) Use `FAILED_PRECONDITION` if the client should not retry until\n // the system state has been explicitly fixed. E.g., if a \"rmdir\"\n // fails because the directory is non-empty, `FAILED_PRECONDITION`\n // should be returned since the client should not retry unless\n // the files are deleted from the directory.\n //\n // HTTP Mapping: 400 Bad Request\n FAILED_PRECONDITION: 400,\n\n // The operation was aborted, typically due to a concurrency issue such as\n // a sequencer check failure or transaction abort.\n //\n // See the guidelines above for deciding between `FAILED_PRECONDITION`,\n // `ABORTED`, and `UNAVAILABLE`.\n //\n // HTTP Mapping: 409 Conflict\n ABORTED: 409,\n\n // The operation was attempted past the valid range. E.g., seeking or\n // reading past end-of-file.\n //\n // Unlike `INVALID_ARGUMENT`, this error indicates a problem that may\n // be fixed if the system state changes. For example, a 32-bit file\n // system will generate `INVALID_ARGUMENT` if asked to read at an\n // offset that is not in the range [0,2^32-1], but it will generate\n // `OUT_OF_RANGE` if asked to read from an offset past the current\n // file size.\n //\n // There is a fair bit of overlap between `FAILED_PRECONDITION` and\n // `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific\n // error) when it applies so that callers who are iterating through\n // a space can easily look for an `OUT_OF_RANGE` error to detect when\n // they are done.\n //\n // HTTP Mapping: 400 Bad Request\n OUT_OF_RANGE: 400,\n\n // The operation is not implemented or is not supported/enabled in this\n // service.\n //\n // HTTP Mapping: 501 Not Implemented\n UNIMPLEMENTED: 501,\n\n // Internal errors. This means that some invariants expected by the\n // underlying system have been broken. This error code is reserved\n // for serious errors.\n //\n // HTTP Mapping: 500 Internal Server Error\n INTERNAL: 500,\n\n // The service is currently unavailable. This is most likely a\n // transient condition, which can be corrected by retrying with\n // a backoff. Note that it is not always safe to retry\n // non-idempotent operations.\n //\n // See the guidelines above for deciding between `FAILED_PRECONDITION`,\n // `ABORTED`, and `UNAVAILABLE`.\n //\n // HTTP Mapping: 503 Service Unavailable\n UNAVAILABLE: 503,\n\n // Unrecoverable data loss or corruption.\n //\n // HTTP Mapping: 500 Internal Server Error\n DATA_LOSS: 500,\n\n // The request does not have valid authentication credentials for the\n // operation.\n //\n // HTTP Mapping: 401 Unauthorized\n UNAUTHENTICATED: 401,\n\n // The request method is not supported by the server and cannot be handled.\n //\n // HTTP Mapping: 405 Method Not Allowed\n METHOD_NOT_ALLOWED: 405,\n} as const;\n\nexport const DEFAULT_MESSAGES: Record<keyof typeof Code, string> = {\n OK: 'OK',\n CANCELLED: 'The operation was cancelled',\n UNKNOWN: 'Unknown error',\n INVALID_ARGUMENT: 'The client specified an invalid argument',\n DEADLINE_EXCEEDED: 'The deadline expired before the operation could complete',\n NOT_FOUND: 'Some requested entity was not found',\n ALREADY_EXISTS: 'The entity that a client attempted to create already exists',\n PERMISSION_DENIED: 'The caller does not have permission to execute the specified operation',\n RESOURCE_EXHAUSTED: 'Some resource has been exhausted',\n FAILED_PRECONDITION:\n \"The operation was rejected because the system is not in a state required for the operation's execution\",\n ABORTED: 'The operation was aborted',\n OUT_OF_RANGE: 'The operation was attempted past the valid range',\n UNIMPLEMENTED: 'The operation is not implemented or is not supported/enabled in this service',\n INTERNAL: 'Internal errors',\n UNAVAILABLE: 'The service is currently unavailable',\n DATA_LOSS: 'Unrecoverable data loss or corruption',\n UNAUTHENTICATED: 'The request does not have valid authentication credentials for the operation',\n METHOD_NOT_ALLOWED: 'The request method is not supported by the server and cannot be handled',\n};\n\nexport interface ErrorBody {\n error: {\n code: number;\n status: keyof typeof Code;\n message: string;\n details: Detail[];\n };\n}\n\nexport class StatusError extends Error {\n readonly status: number;\n readonly body?: ErrorBody;\n\n constructor(status: number, body?: ErrorBody) {\n super(body?.error?.message ?? `Status Error: ${status}`);\n this.name = 'StatusError';\n this.status = status;\n this.body = body;\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, StatusError);\n }\n Object.setPrototypeOf(this, StatusError.prototype);\n }\n}\n\nexport class StatusCode {\n code: keyof typeof Code;\n message?: string;\n private constructor(code: keyof typeof Code, message?: string) {\n this.code = code;\n this.message = message;\n }\n\n static of(code: keyof typeof Code, message?: string) {\n return new StatusCode(code, message ?? DEFAULT_MESSAGES[code]);\n }\n\n body(details?: Details): ErrorBody {\n return {\n error: {\n code: Code[this.code],\n status: this.code,\n message: this.message ?? '',\n details: details?.list ?? [],\n },\n };\n }\n\n error(details?: Details): Error {\n const body = this.body(details);\n if (Status.adapter) return Status.adapter(Code[this.code], body);\n return new StatusError(Code[this.code], body);\n }\n\n response(details?: Details): Response {\n const body = this.body(details);\n return Response.json(body, { status: body.error.code });\n }\n}\n\nexport class Status {\n static adapter?: (status: number, response: ErrorBody) => Error;\n\n static ok = (message?: string) => StatusCode.of('OK', message);\n static cancelled = (message?: string) => StatusCode.of('CANCELLED', message);\n static unknown = (message?: string) => StatusCode.of('UNKNOWN', message);\n static invalidArgument = (message?: string) => StatusCode.of('INVALID_ARGUMENT', message);\n static deadlineExceeded = (message?: string) => StatusCode.of('DEADLINE_EXCEEDED', message);\n static notFound = (message?: string) => StatusCode.of('NOT_FOUND', message);\n static alreadyExists = (message?: string) => StatusCode.of('ALREADY_EXISTS', message);\n static permissionDenied = (message?: string) => StatusCode.of('PERMISSION_DENIED', message);\n static unauthorized = (message?: string) => StatusCode.of('UNAUTHENTICATED', message);\n static resourceExhausted = (message?: string) => StatusCode.of('RESOURCE_EXHAUSTED', message);\n static failedPrecondition = (message?: string) => StatusCode.of('FAILED_PRECONDITION', message);\n static aborted = (message?: string) => StatusCode.of('ABORTED', message);\n static outOfRange = (message?: string) => StatusCode.of('OUT_OF_RANGE', message);\n static unimplemented = (message?: string) => StatusCode.of('UNIMPLEMENTED', message);\n static internal = (message?: string) => StatusCode.of('INTERNAL', message);\n static unavailable = (message?: string) => StatusCode.of('UNAVAILABLE', message);\n static dataLoss = (message?: string) => StatusCode.of('DATA_LOSS', message);\n static methodNotAllowed = (message?: string) => StatusCode.of('METHOD_NOT_ALLOWED', message);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/error/status.ts"],"sourcesContent":["import type { Detail, Details } from './detail';\n\nexport const Code = {\n // Not an error; returned on success\n //\n // HTTP Mapping: 200 OK\n OK: 200,\n\n // The operation was cancelled, typically by the caller.\n //\n // HTTP Mapping: 499 Client Closed Request\n CANCELLED: 499,\n\n // Unknown error. For example, this error may be returned when\n // a `Status` value received from another address space belongs to\n // an error space that is not known in this address space. Also,\n // errors raised by APIs that do not return enough error information\n // may be converted to this error.\n //\n // HTTP Mapping: 500 Internal Server Error\n UNKNOWN: 500,\n\n // The client specified an invalid argument. Note that this differs\n // from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments\n // that are problematic regardless of the state of the system\n // (e.g., a malformed file name).\n //\n // HTTP Mapping: 400 Bad Request\n INVALID_ARGUMENT: 400,\n\n // The deadline expired before the operation could complete. For operations\n // that change the state of the system, this error may be returned\n // even if the operation has completed successfully. For example, a\n // successful response from a server could have been delayed long\n // enough for the deadline to expire.\n //\n // HTTP Mapping: 504 Gateway Timeout\n DEADLINE_EXCEEDED: 504,\n\n // Some requested entity (e.g., file or directory) was not found.\n //\n // Note to server developers: if a request is denied for an entire class\n // of users, such as gradual feature rollout or undocumented whitelist,\n // `NOT_FOUND` may be used. If a request is denied for some users within\n // a class of users, such as user-based access control, `PERMISSION_DENIED`\n // must be used.\n //\n // HTTP Mapping: 404 Not Found\n NOT_FOUND: 404,\n\n // The entity that a client attempted to create (e.g., file or directory)\n // already exists.\n //\n // HTTP Mapping: 409 Conflict\n ALREADY_EXISTS: 409,\n\n // The caller does not have permission to execute the specified\n // operation. `PERMISSION_DENIED` must not be used for rejections\n // caused by exhausting some resource (use `RESOURCE_EXHAUSTED`\n // instead for those errors). `PERMISSION_DENIED` must not be\n // used if the caller can not be identified (use `UNAUTHENTICATED`\n // instead for those errors). This error code does not imply the\n // request is valid or the requested entity exists or satisfies\n // other pre-conditions.\n //\n // HTTP Mapping: 403 Forbidden\n PERMISSION_DENIED: 403,\n\n // Some resource has been exhausted, perhaps a per-user quota, or\n // perhaps the entire file system is out of space.\n //\n // HTTP Mapping: 429 Too Many Requests\n RESOURCE_EXHAUSTED: 429,\n\n // The operation was rejected because the system is not in a state\n // required for the operation's execution. For example, the directory\n // to be deleted is non-empty, a rmdir operation is applied to\n // a non-directory, etc.\n //\n // Service implementors can use the following guidelines to decide\n // between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`:\n // (a) Use `UNAVAILABLE` if the client can retry just the failing call.\n // (b) Use `ABORTED` if the client should retry at a higher level\n // (e.g., when a client-specified test-and-set fails, indicating the\n // client should restart a read-modify-write sequence).\n // (c) Use `FAILED_PRECONDITION` if the client should not retry until\n // the system state has been explicitly fixed. E.g., if a \"rmdir\"\n // fails because the directory is non-empty, `FAILED_PRECONDITION`\n // should be returned since the client should not retry unless\n // the files are deleted from the directory.\n //\n // HTTP Mapping: 400 Bad Request\n FAILED_PRECONDITION: 400,\n\n // The operation was aborted, typically due to a concurrency issue such as\n // a sequencer check failure or transaction abort.\n //\n // See the guidelines above for deciding between `FAILED_PRECONDITION`,\n // `ABORTED`, and `UNAVAILABLE`.\n //\n // HTTP Mapping: 409 Conflict\n ABORTED: 409,\n\n // The operation was attempted past the valid range. E.g., seeking or\n // reading past end-of-file.\n //\n // Unlike `INVALID_ARGUMENT`, this error indicates a problem that may\n // be fixed if the system state changes. For example, a 32-bit file\n // system will generate `INVALID_ARGUMENT` if asked to read at an\n // offset that is not in the range [0,2^32-1], but it will generate\n // `OUT_OF_RANGE` if asked to read from an offset past the current\n // file size.\n //\n // There is a fair bit of overlap between `FAILED_PRECONDITION` and\n // `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific\n // error) when it applies so that callers who are iterating through\n // a space can easily look for an `OUT_OF_RANGE` error to detect when\n // they are done.\n //\n // HTTP Mapping: 400 Bad Request\n OUT_OF_RANGE: 400,\n\n // The operation is not implemented or is not supported/enabled in this\n // service.\n //\n // HTTP Mapping: 501 Not Implemented\n UNIMPLEMENTED: 501,\n\n // Internal errors. This means that some invariants expected by the\n // underlying system have been broken. This error code is reserved\n // for serious errors.\n //\n // HTTP Mapping: 500 Internal Server Error\n INTERNAL: 500,\n\n // The service is currently unavailable. This is most likely a\n // transient condition, which can be corrected by retrying with\n // a backoff. Note that it is not always safe to retry\n // non-idempotent operations.\n //\n // See the guidelines above for deciding between `FAILED_PRECONDITION`,\n // `ABORTED`, and `UNAVAILABLE`.\n //\n // HTTP Mapping: 503 Service Unavailable\n UNAVAILABLE: 503,\n\n // Unrecoverable data loss or corruption.\n //\n // HTTP Mapping: 500 Internal Server Error\n DATA_LOSS: 500,\n\n // The request does not have valid authentication credentials for the\n // operation.\n //\n // HTTP Mapping: 401 Unauthorized\n UNAUTHENTICATED: 401,\n\n // The request method is not supported by the server and cannot be handled.\n //\n // HTTP Mapping: 405 Method Not Allowed\n METHOD_NOT_ALLOWED: 405,\n} as const;\n\nexport const DEFAULT_MESSAGES: Record<keyof typeof Code, string> = {\n OK: 'OK',\n CANCELLED: 'The operation was cancelled',\n UNKNOWN: 'Unknown error',\n INVALID_ARGUMENT: 'The client specified an invalid argument',\n DEADLINE_EXCEEDED: 'The deadline expired before the operation could complete',\n NOT_FOUND: 'Some requested entity was not found',\n ALREADY_EXISTS: 'The entity that a client attempted to create already exists',\n PERMISSION_DENIED: 'The caller does not have permission to execute the specified operation',\n RESOURCE_EXHAUSTED: 'Some resource has been exhausted',\n FAILED_PRECONDITION:\n \"The operation was rejected because the system is not in a state required for the operation's execution\",\n ABORTED: 'The operation was aborted',\n OUT_OF_RANGE: 'The operation was attempted past the valid range',\n UNIMPLEMENTED: 'The operation is not implemented or is not supported/enabled in this service',\n INTERNAL: 'Internal errors',\n UNAVAILABLE: 'The service is currently unavailable',\n DATA_LOSS: 'Unrecoverable data loss or corruption',\n UNAUTHENTICATED: 'The request does not have valid authentication credentials for the operation',\n METHOD_NOT_ALLOWED: 'The request method is not supported by the server and cannot be handled',\n};\n\nexport interface ErrorBody {\n error: {\n code: number;\n status: keyof typeof Code;\n message: string;\n details: Detail[];\n };\n}\n\nexport class StatusError extends Error {\n readonly status: number;\n readonly body?: ErrorBody;\n\n constructor(status: number, body?: ErrorBody) {\n super(body?.error?.message ?? `Status Error: ${status}`);\n this.name = 'StatusError';\n this.status = status;\n this.body = body;\n Object.setPrototypeOf(this, StatusError.prototype);\n }\n}\n\nexport class StatusCode {\n code: keyof typeof Code;\n message?: string;\n private constructor(code: keyof typeof Code, message?: string) {\n this.code = code;\n this.message = message;\n }\n\n static of(code: keyof typeof Code, message?: string) {\n return new StatusCode(code, message ?? DEFAULT_MESSAGES[code]);\n }\n\n body(details?: Details): ErrorBody {\n return {\n error: {\n code: Code[this.code],\n status: this.code,\n message: this.message ?? '',\n details: details?.list ?? [],\n },\n };\n }\n\n error(details?: Details): Error {\n const body = this.body(details);\n if (Status.adapter) return Status.adapter(Code[this.code], body);\n return new StatusError(Code[this.code], body);\n }\n\n response(details?: Details): Response {\n const body = this.body(details);\n return Response.json(body, { status: body.error.code });\n }\n}\n\nexport class Status {\n static adapter?: (status: number, response: ErrorBody) => Error;\n\n static ok = (message?: string) => StatusCode.of('OK', message);\n static cancelled = (message?: string) => StatusCode.of('CANCELLED', message);\n static unknown = (message?: string) => StatusCode.of('UNKNOWN', message);\n static invalidArgument = (message?: string) => StatusCode.of('INVALID_ARGUMENT', message);\n static deadlineExceeded = (message?: string) => StatusCode.of('DEADLINE_EXCEEDED', message);\n static notFound = (message?: string) => StatusCode.of('NOT_FOUND', message);\n static alreadyExists = (message?: string) => StatusCode.of('ALREADY_EXISTS', message);\n static permissionDenied = (message?: string) => StatusCode.of('PERMISSION_DENIED', message);\n static unauthorized = (message?: string) => StatusCode.of('UNAUTHENTICATED', message);\n static resourceExhausted = (message?: string) => StatusCode.of('RESOURCE_EXHAUSTED', message);\n static failedPrecondition = (message?: string) => StatusCode.of('FAILED_PRECONDITION', message);\n static aborted = (message?: string) => StatusCode.of('ABORTED', message);\n static outOfRange = (message?: string) => StatusCode.of('OUT_OF_RANGE', message);\n static unimplemented = (message?: string) => StatusCode.of('UNIMPLEMENTED', message);\n static internal = (message?: string) => StatusCode.of('INTERNAL', message);\n static unavailable = (message?: string) => StatusCode.of('UNAVAILABLE', message);\n static dataLoss = (message?: string) => StatusCode.of('DATA_LOSS', message);\n static methodNotAllowed = (message?: string) => StatusCode.of('METHOD_NOT_ALLOWED', message);\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/google-one-tap/index.ts"],"sourcesContent":["import type { GoogleAccounts, CredentialResponse } from './types';\n\ndeclare global {\n interface Window {\n google: {\n accounts: GoogleAccounts;\n };\n }\n}\n\nexport type Props = {\n clientId: string;\n callback: (response: CredentialResponse) => void | Promise<void>;\n};\n\n/** debug: chrome://settings/content/federatedIdentityApi */\nexport function prompt({ clientId, callback }: Props) {\n const scriptId = 'google-one-tap';\n const script = document.createElement('script');\n script.id = scriptId;\n script.async = true;\n script.defer = true;\n script.src = 'https://accounts.google.com/gsi/client';\n script.onload = () => {\n window.google.accounts.id.initialize({\n ux_mode: 'popup',\n context: 'signin',\n auto_select: false,\n client_id: clientId,\n use_fedcm_for_prompt: true,\n cancel_on_tap_outside: false,\n callback,\n });\n window.google?.accounts?.id?.prompt();\n };\n\n document.head.appendChild(script);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBO,SAAS,OAAO,EAAE,UAAU,SAAS,GAAU;AACpD,QAAM,WAAW;AACjB,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,KAAK;AACZ,SAAO,QAAQ;AACf,SAAO,QAAQ;AACf,SAAO,MAAM;AACb,SAAO,SAAS,MAAM;AACpB,WAAO,OAAO,SAAS,GAAG,WAAW;AAAA,MACnC,SAAS;AAAA,MACT,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,MACX,sBAAsB;AAAA,MACtB,uBAAuB;AAAA,MACvB;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,UAAU,IAAI,OAAO;AAAA,EACtC;AAEA,WAAS,KAAK,YAAY,MAAM;AAClC;","names":[]}
1
+ {"version":3,"sources":["../../src/google-one-tap/index.ts"],"sourcesContent":["import type { CredentialResponse, GoogleAccounts } from './types';\n\ndeclare global {\n interface Window {\n google: {\n accounts: GoogleAccounts;\n };\n }\n}\n\nexport type Props = {\n clientId: string;\n callback: (response: CredentialResponse) => void | Promise<void>;\n};\n\n/** debug: chrome://settings/content/federatedIdentityApi */\nexport function prompt({ clientId, callback }: Props) {\n const scriptId = 'google-one-tap';\n const script = document.createElement('script');\n script.id = scriptId;\n script.async = true;\n script.defer = true;\n script.src = 'https://accounts.google.com/gsi/client';\n script.onload = () => {\n window.google.accounts.id.initialize({\n ux_mode: 'popup',\n context: 'signin',\n auto_select: false,\n client_id: clientId,\n use_fedcm_for_prompt: true,\n cancel_on_tap_outside: false,\n callback,\n });\n window.google?.accounts?.id?.prompt();\n };\n\n document.head.appendChild(script);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBO,SAAS,OAAO,EAAE,UAAU,SAAS,GAAU;AACpD,QAAM,WAAW;AACjB,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,KAAK;AACZ,SAAO,QAAQ;AACf,SAAO,QAAQ;AACf,SAAO,MAAM;AACb,SAAO,SAAS,MAAM;AACpB,WAAO,OAAO,SAAS,GAAG,WAAW;AAAA,MACnC,SAAS;AAAA,MACT,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,MACX,sBAAsB;AAAA,MACtB,uBAAuB;AAAA,MACvB;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,UAAU,IAAI,OAAO;AAAA,EACtC;AAEA,WAAS,KAAK,YAAY,MAAM;AAClC;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/google-one-tap/index.ts"],"sourcesContent":["import type { GoogleAccounts, CredentialResponse } from './types';\n\ndeclare global {\n interface Window {\n google: {\n accounts: GoogleAccounts;\n };\n }\n}\n\nexport type Props = {\n clientId: string;\n callback: (response: CredentialResponse) => void | Promise<void>;\n};\n\n/** debug: chrome://settings/content/federatedIdentityApi */\nexport function prompt({ clientId, callback }: Props) {\n const scriptId = 'google-one-tap';\n const script = document.createElement('script');\n script.id = scriptId;\n script.async = true;\n script.defer = true;\n script.src = 'https://accounts.google.com/gsi/client';\n script.onload = () => {\n window.google.accounts.id.initialize({\n ux_mode: 'popup',\n context: 'signin',\n auto_select: false,\n client_id: clientId,\n use_fedcm_for_prompt: true,\n cancel_on_tap_outside: false,\n callback,\n });\n window.google?.accounts?.id?.prompt();\n };\n\n document.head.appendChild(script);\n}\n"],"mappings":";AAgBO,SAAS,OAAO,EAAE,UAAU,SAAS,GAAU;AACpD,QAAM,WAAW;AACjB,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,KAAK;AACZ,SAAO,QAAQ;AACf,SAAO,QAAQ;AACf,SAAO,MAAM;AACb,SAAO,SAAS,MAAM;AACpB,WAAO,OAAO,SAAS,GAAG,WAAW;AAAA,MACnC,SAAS;AAAA,MACT,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,MACX,sBAAsB;AAAA,MACtB,uBAAuB;AAAA,MACvB;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,UAAU,IAAI,OAAO;AAAA,EACtC;AAEA,WAAS,KAAK,YAAY,MAAM;AAClC;","names":[]}
1
+ {"version":3,"sources":["../../src/google-one-tap/index.ts"],"sourcesContent":["import type { CredentialResponse, GoogleAccounts } from './types';\n\ndeclare global {\n interface Window {\n google: {\n accounts: GoogleAccounts;\n };\n }\n}\n\nexport type Props = {\n clientId: string;\n callback: (response: CredentialResponse) => void | Promise<void>;\n};\n\n/** debug: chrome://settings/content/federatedIdentityApi */\nexport function prompt({ clientId, callback }: Props) {\n const scriptId = 'google-one-tap';\n const script = document.createElement('script');\n script.id = scriptId;\n script.async = true;\n script.defer = true;\n script.src = 'https://accounts.google.com/gsi/client';\n script.onload = () => {\n window.google.accounts.id.initialize({\n ux_mode: 'popup',\n context: 'signin',\n auto_select: false,\n client_id: clientId,\n use_fedcm_for_prompt: true,\n cancel_on_tap_outside: false,\n callback,\n });\n window.google?.accounts?.id?.prompt();\n };\n\n document.head.appendChild(script);\n}\n"],"mappings":";AAgBO,SAAS,OAAO,EAAE,UAAU,SAAS,GAAU;AACpD,QAAM,WAAW;AACjB,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,KAAK;AACZ,SAAO,QAAQ;AACf,SAAO,QAAQ;AACf,SAAO,MAAM;AACb,SAAO,SAAS,MAAM;AACpB,WAAO,OAAO,SAAS,GAAG,WAAW;AAAA,MACnC,SAAS;AAAA,MACT,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,MACX,sBAAsB;AAAA,MACtB,uBAAuB;AAAA,MACvB;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,UAAU,IAAI,OAAO;AAAA,EACtC;AAEA,WAAS,KAAK,YAAY,MAAM;AAClC;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hono/__tests__/authorizer.test.ts"],"sourcesContent":["import { Hono } from 'hono';\nimport { requestId } from 'hono/request-id';\nimport { authorizer, type AuthorizerConfig } from '../authorizer';\nimport { errorHandler, type Env } from '../handler';\n\ndescribe('authorizer', () => {\n let app: Hono<Env>;\n\n beforeEach(() => {\n app = new Hono<Env>();\n app.use(requestId());\n app.onError(errorHandler);\n });\n\n describe('Basic functionality', () => {\n it('should allow all requests when no rules are defined', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(true),\n };\n\n app.use(authorizer({ auth }));\n app.get('/test', (c) => c.text('OK'));\n\n const res = await app.request('/test');\n expect(res.status).toBe(200);\n expect(auth.isAuthenticated).not.toHaveBeenCalled();\n });\n\n it('should allow requests when rules match and authentication passes', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(true),\n };\n\n app.use(authorizer({ auth, rules: [{ path: '/protected', methods: ['GET'] }] }));\n app.get('/protected', (c) => c.text('Protected content'));\n\n const res = await app.request('/protected');\n expect(res.status).toBe(200);\n expect(await res.text()).toBe('Protected content');\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(1);\n });\n\n it('should reject requests when rules match but authentication fails', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(authorizer({ auth, rules: [{ path: '/protected', methods: ['GET'] }] }));\n app.get('/protected', (c) => c.text('Protected content'));\n\n const res = await app.request('/protected');\n expect(res.status).toBe(401);\n // StatusError wraps the message, just verify status\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(1);\n });\n\n it('should support custom error messages', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n const customMessage = 'Please login first';\n\n app.use(\n authorizer({\n auth,\n errorMessage: customMessage,\n rules: [{ path: '/protected', methods: ['GET'] }],\n })\n );\n app.get('/protected', (c) => c.text('Protected content'));\n\n const res = await app.request('/protected');\n expect(res.status).toBe(401);\n // Error message is wrapped in StatusError, just verify status\n });\n });\n\n describe('HTTP methods', () => {\n it('should only protect specified HTTP methods', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/users', methods: ['POST', 'DELETE'] }],\n })\n );\n app.get('/api/users', (c) => c.text('GET allowed'));\n app.post('/api/users', (c) => c.text('POST protected'));\n app.delete('/api/users', (c) => c.text('DELETE protected'));\n app.put('/api/users', (c) => c.text('PUT allowed'));\n\n // GET should pass (not protected)\n const getRes = await app.request('/api/users', { method: 'GET' });\n expect(getRes.status).toBe(200);\n expect(await getRes.text()).toBe('GET allowed');\n\n // POST should be rejected (protected and auth failed)\n const postRes = await app.request('/api/users', { method: 'POST' });\n expect(postRes.status).toBe(401);\n\n // DELETE should be rejected (protected and auth failed)\n const deleteRes = await app.request('/api/users', { method: 'DELETE' });\n expect(deleteRes.status).toBe(401);\n\n // PUT should pass (not protected)\n const putRes = await app.request('/api/users', { method: 'PUT' });\n expect(putRes.status).toBe(200);\n expect(await putRes.text()).toBe('PUT allowed');\n\n // auth.isAuthenticated should only be called for POST and DELETE\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(2);\n });\n\n it('should protect all methods when methods not specified', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/admin' }], // methods not specified\n })\n );\n app.get('/api/admin', (c) => c.text('GET'));\n app.post('/api/admin', (c) => c.text('POST'));\n app.put('/api/admin', (c) => c.text('PUT'));\n app.delete('/api/admin', (c) => c.text('DELETE'));\n\n // All methods should be rejected\n const methods = ['GET', 'POST', 'PUT', 'DELETE'];\n for (const method of methods) {\n const res = await app.request('/api/admin', { method });\n expect(res.status).toBe(401);\n }\n\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(4);\n });\n\n it('should always allow OPTIONS requests', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/*' }], // protect all /api/* paths\n })\n );\n app.options('/api/test', (c) => c.text('OPTIONS OK'));\n\n const res = await app.request('/api/test', { method: 'OPTIONS' });\n expect(res.status).toBe(200);\n expect(await res.text()).toBe('OPTIONS OK');\n expect(auth.isAuthenticated).not.toHaveBeenCalled();\n });\n });\n\n describe('Path matching', () => {\n it('should support exact path matching', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/users' }],\n })\n );\n app.get('/api/users', (c) => c.text('Exact'));\n app.get('/api/users/123', (c) => c.text('With ID'));\n app.get('/api', (c) => c.text('Parent'));\n\n // Exact match path should be protected\n const exactRes = await app.request('/api/users');\n expect(exactRes.status).toBe(401);\n\n // Other paths should pass\n const idRes = await app.request('/api/users/123');\n expect(idRes.status).toBe(200);\n expect(await idRes.text()).toBe('With ID');\n\n const parentRes = await app.request('/api');\n expect(parentRes.status).toBe(200);\n expect(await parentRes.text()).toBe('Parent');\n });\n\n it('should support wildcard path matching', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/*' }, { path: '/admin/:id' }],\n })\n );\n app.get('/api/users', (c) => c.text('API Users'));\n app.get('/api/posts/123', (c) => c.text('API Post'));\n app.get('/admin/123', (c) => c.text('Admin'));\n app.get('/public', (c) => c.text('Public'));\n\n // All paths under /api/* should be protected\n const apiUsersRes = await app.request('/api/users');\n expect(apiUsersRes.status).toBe(401);\n\n const apiPostRes = await app.request('/api/posts/123');\n expect(apiPostRes.status).toBe(401);\n\n // /admin/:id should be protected\n const adminRes = await app.request('/admin/123');\n expect(adminRes.status).toBe(401);\n\n // /public should pass\n const publicRes = await app.request('/public');\n expect(publicRes.status).toBe(200);\n expect(await publicRes.text()).toBe('Public');\n });\n\n it('should support pattern-like path matching', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [\n { path: '/api/v1/*' },\n { path: '/api/v2/*' },\n { path: '/data.json' },\n { path: '/config.json' },\n ],\n })\n );\n app.get('/api/v1/users', (c) => c.text('V1'));\n app.get('/api/v2/users', (c) => c.text('V2'));\n app.get('/api/v3/users', (c) => c.text('V3'));\n app.get('/data.json', (c) => c.text('JSON'));\n app.get('/config.json', (c) => c.text('Config JSON'));\n app.get('/data.xml', (c) => c.text('XML'));\n\n // v1 and v2 should be protected\n const v1Res = await app.request('/api/v1/users');\n expect(v1Res.status).toBe(401);\n\n const v2Res = await app.request('/api/v2/users');\n expect(v2Res.status).toBe(401);\n\n // v3 should pass\n const v3Res = await app.request('/api/v3/users');\n expect(v3Res.status).toBe(200);\n\n // .json files should be protected\n const jsonRes = await app.request('/data.json');\n expect(jsonRes.status).toBe(401);\n\n const configJsonRes = await app.request('/config.json');\n expect(configJsonRes.status).toBe(401);\n\n // .xml files should pass\n const xmlRes = await app.request('/data.xml');\n expect(xmlRes.status).toBe(200);\n });\n });\n\n describe('Authentication function', () => {\n it('should pass Request object correctly to auth function', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockImplementation(async (request: Request) => {\n const authHeader = request.headers.get('Authorization');\n return authHeader === 'Bearer valid-token';\n }),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/protected' }],\n })\n );\n app.get('/protected', (c) => c.text('Protected'));\n\n // No token should fail\n const noTokenRes = await app.request('/protected');\n expect(noTokenRes.status).toBe(401);\n\n // Invalid token should fail\n const invalidTokenRes = await app.request('/protected', {\n headers: { Authorization: 'Bearer invalid-token' },\n });\n expect(invalidTokenRes.status).toBe(401);\n\n // Valid token should succeed\n const validTokenRes = await app.request('/protected', {\n headers: { Authorization: 'Bearer valid-token' },\n });\n expect(validTokenRes.status).toBe(200);\n expect(await validTokenRes.text()).toBe('Protected');\n\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(3);\n });\n\n it('should handle exceptions thrown by auth function', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockRejectedValue(new Error('Auth service error')),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/protected' }],\n })\n );\n app.get('/protected', (c) => c.text('Protected'));\n\n const res = await app.request('/protected');\n expect(res.status).toBe(500);\n // Error details are wrapped, just verify status\n });\n\n it('should support cookie-based authentication', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockImplementation(async (request: Request) => {\n const cookie = request.headers.get('Cookie');\n return cookie?.includes('session=valid-session');\n }),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/dashboard' }],\n })\n );\n app.get('/dashboard', (c) => c.text('Dashboard'));\n\n // No cookie should fail\n const noCookieRes = await app.request('/dashboard');\n expect(noCookieRes.status).toBe(401);\n\n // Valid cookie should succeed\n const validCookieRes = await app.request('/dashboard', {\n headers: { Cookie: 'session=valid-session; other=value' },\n });\n expect(validCookieRes.status).toBe(200);\n expect(await validCookieRes.text()).toBe('Dashboard');\n });\n\n it('should support query parameter authentication', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockImplementation(async (request: Request) => {\n const url = new URL(request.url);\n return url.searchParams.get('api_key') === 'valid-key';\n }),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/data' }],\n })\n );\n app.get('/api/data', (c) => c.text('Data'));\n\n // No API key should fail\n const noKeyRes = await app.request('/api/data');\n expect(noKeyRes.status).toBe(401);\n\n // Invalid API key should fail\n const invalidKeyRes = await app.request('/api/data?api_key=invalid-key');\n expect(invalidKeyRes.status).toBe(401);\n\n // Valid API key should succeed\n const validKeyRes = await app.request('/api/data?api_key=valid-key');\n expect(validKeyRes.status).toBe(200);\n expect(await validKeyRes.text()).toBe('Data');\n });\n });\n\n describe('Multiple rules', () => {\n it('should support multiple rule combinations', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [\n { path: '/api/users', methods: ['POST', 'PUT', 'DELETE'] },\n { path: '/api/admin/*' },\n { path: '/api/reports', methods: ['GET'] },\n { path: '/webhook/*', methods: ['POST'] },\n ],\n })\n );\n\n // Setup routes\n app.get('/api/users', (c) => c.text('GET users'));\n app.post('/api/users', (c) => c.text('POST users'));\n app.get('/api/admin/settings', (c) => c.text('Admin settings'));\n app.get('/api/reports', (c) => c.text('Reports'));\n app.post('/webhook/github', (c) => c.text('Webhook'));\n app.get('/public', (c) => c.text('Public'));\n\n // GET /api/users should pass (not protected)\n const getUsersRes = await app.request('/api/users');\n expect(getUsersRes.status).toBe(200);\n\n // POST /api/users should be rejected (protected)\n const postUsersRes = await app.request('/api/users', { method: 'POST' });\n expect(postUsersRes.status).toBe(401);\n\n // GET /api/admin/settings should be rejected (all methods protected)\n const adminRes = await app.request('/api/admin/settings');\n expect(adminRes.status).toBe(401);\n\n // GET /api/reports should be rejected (GET method protected)\n const reportsRes = await app.request('/api/reports');\n expect(reportsRes.status).toBe(401);\n\n // POST /webhook/github should be rejected (POST method protected)\n const webhookRes = await app.request('/webhook/github', { method: 'POST' });\n expect(webhookRes.status).toBe(401);\n\n // GET /public should pass (not protected)\n const publicRes = await app.request('/public');\n expect(publicRes.status).toBe(200);\n });\n\n it('should handle overlapping rules correctly', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(true),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [\n { path: '/api/*' }, // protect all /api/* paths\n { path: '/api/public', methods: ['GET'] }, // also protect GET /api/public\n ],\n })\n );\n app.get('/api/public', (c) => c.text('Public API'));\n app.post('/api/public', (c) => c.text('POST Public API'));\n\n // Both rules match, but auth passes, so should succeed\n const getRes = await app.request('/api/public');\n expect(getRes.status).toBe(200);\n\n const postRes = await app.request('/api/public', { method: 'POST' });\n expect(postRes.status).toBe(200);\n\n // Auth function should be called twice\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(2);\n });\n });\n\n describe('Edge cases', () => {\n it('should allow all requests with empty rules array', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(authorizer({ auth, rules: [] }));\n app.get('/any/path', (c) => c.text('OK'));\n\n const res = await app.request('/any/path');\n expect(res.status).toBe(200);\n expect(auth.isAuthenticated).not.toHaveBeenCalled();\n });\n\n it('should handle special characters in paths', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [\n { path: '/api/user@email.com' },\n { path: '/files/*.pdf' },\n { path: '/path-with-dash' },\n { path: '/path_with_underscore' },\n ],\n })\n );\n\n app.get('/api/user@email.com', (c) => c.text('Email'));\n app.get('/files/document.pdf', (c) => c.text('PDF'));\n app.get('/path-with-dash', (c) => c.text('Dash'));\n app.get('/path_with_underscore', (c) => c.text('Underscore'));\n\n // All special character paths should be matched and protected correctly\n const emailRes = await app.request('/api/user@email.com');\n expect(emailRes.status).toBe(401);\n\n const pdfRes = await app.request('/files/document.pdf');\n expect(pdfRes.status).toBe(401);\n\n const dashRes = await app.request('/path-with-dash');\n expect(dashRes.status).toBe(401);\n\n const underscoreRes = await app.request('/path_with_underscore');\n expect(underscoreRes.status).toBe(401);\n });\n\n it('should handle URLs with query parameters and fragments', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/search' }],\n })\n );\n app.get('/api/search', (c) => c.text('Search'));\n\n // Requests with query parameters should be matched correctly\n const res = await app.request('/api/search?q=test&page=1#results');\n expect(res.status).toBe(401);\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(1);\n });\n\n it('should handle root path correctly', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/' }],\n })\n );\n app.get('/', (c) => c.text('Home'));\n app.get('/other', (c) => c.text('Other'));\n\n // Root path should be protected\n const rootRes = await app.request('/');\n expect(rootRes.status).toBe(401);\n\n // Other paths should pass\n const otherRes = await app.request('/other');\n expect(otherRes.status).toBe(200);\n });\n\n it('should handle trailing slashes as different paths', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/users' }, { path: '/api/users/' }],\n })\n );\n app.get('/api/users', (c) => c.text('Users'));\n app.get('/api/users/', (c) => c.text('Users with slash'));\n\n // Both paths should be protected when explicitly defined\n const withoutSlash = await app.request('/api/users');\n expect(withoutSlash.status).toBe(401);\n\n const withSlash = await app.request('/api/users/');\n expect(withSlash.status).toBe(401);\n });\n });\n\n describe('Complex authentication scenarios', () => {\n it('should support role-based authentication', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockImplementation(async (request: Request) => {\n const authHeader = request.headers.get('Authorization');\n const url = new URL(request.url);\n\n // Admin endpoints require admin token\n if (url.pathname.startsWith('/admin')) {\n return authHeader === 'Bearer admin-token';\n }\n\n // Regular endpoints accept any valid token\n return authHeader?.startsWith('Bearer ');\n }),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/admin/*' }, { path: '/api/*' }],\n })\n );\n\n app.get('/admin/users', (c) => c.text('Admin Users'));\n app.get('/api/data', (c) => c.text('API Data'));\n\n // Admin endpoint with regular token should fail\n const adminWithRegularToken = await app.request('/admin/users', {\n headers: { Authorization: 'Bearer user-token' },\n });\n expect(adminWithRegularToken.status).toBe(401);\n\n // Admin endpoint with admin token should succeed\n const adminWithAdminToken = await app.request('/admin/users', {\n headers: { Authorization: 'Bearer admin-token' },\n });\n expect(adminWithAdminToken.status).toBe(200);\n\n // API endpoint with any token should succeed\n const apiWithUserToken = await app.request('/api/data', {\n headers: { Authorization: 'Bearer user-token' },\n });\n expect(apiWithUserToken.status).toBe(200);\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/hono/__tests__/authorizer.test.ts"],"sourcesContent":["import { Hono } from 'hono';\nimport { requestId } from 'hono/request-id';\nimport { type AuthorizerConfig, authorizer } from '../authorizer';\nimport { type Env, errorHandler } from '../handler';\n\ndescribe('authorizer', () => {\n let app: Hono<Env>;\n\n beforeEach(() => {\n app = new Hono<Env>();\n app.use(requestId());\n app.onError(errorHandler);\n });\n\n describe('Basic functionality', () => {\n it('should allow all requests when no rules are defined', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(true),\n };\n\n app.use(authorizer({ auth }));\n app.get('/test', (c) => c.text('OK'));\n\n const res = await app.request('/test');\n expect(res.status).toBe(200);\n expect(auth.isAuthenticated).not.toHaveBeenCalled();\n });\n\n it('should allow requests when rules match and authentication passes', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(true),\n };\n\n app.use(authorizer({ auth, rules: [{ path: '/protected', methods: ['GET'] }] }));\n app.get('/protected', (c) => c.text('Protected content'));\n\n const res = await app.request('/protected');\n expect(res.status).toBe(200);\n expect(await res.text()).toBe('Protected content');\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(1);\n });\n\n it('should reject requests when rules match but authentication fails', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(authorizer({ auth, rules: [{ path: '/protected', methods: ['GET'] }] }));\n app.get('/protected', (c) => c.text('Protected content'));\n\n const res = await app.request('/protected');\n expect(res.status).toBe(401);\n // StatusError wraps the message, just verify status\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(1);\n });\n\n it('should support custom error messages', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n const customMessage = 'Please login first';\n\n app.use(\n authorizer({\n auth,\n errorMessage: customMessage,\n rules: [{ path: '/protected', methods: ['GET'] }],\n })\n );\n app.get('/protected', (c) => c.text('Protected content'));\n\n const res = await app.request('/protected');\n expect(res.status).toBe(401);\n // Error message is wrapped in StatusError, just verify status\n });\n });\n\n describe('HTTP methods', () => {\n it('should only protect specified HTTP methods', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/users', methods: ['POST', 'DELETE'] }],\n })\n );\n app.get('/api/users', (c) => c.text('GET allowed'));\n app.post('/api/users', (c) => c.text('POST protected'));\n app.delete('/api/users', (c) => c.text('DELETE protected'));\n app.put('/api/users', (c) => c.text('PUT allowed'));\n\n // GET should pass (not protected)\n const getRes = await app.request('/api/users', { method: 'GET' });\n expect(getRes.status).toBe(200);\n expect(await getRes.text()).toBe('GET allowed');\n\n // POST should be rejected (protected and auth failed)\n const postRes = await app.request('/api/users', { method: 'POST' });\n expect(postRes.status).toBe(401);\n\n // DELETE should be rejected (protected and auth failed)\n const deleteRes = await app.request('/api/users', { method: 'DELETE' });\n expect(deleteRes.status).toBe(401);\n\n // PUT should pass (not protected)\n const putRes = await app.request('/api/users', { method: 'PUT' });\n expect(putRes.status).toBe(200);\n expect(await putRes.text()).toBe('PUT allowed');\n\n // auth.isAuthenticated should only be called for POST and DELETE\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(2);\n });\n\n it('should protect all methods when methods not specified', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/admin' }], // methods not specified\n })\n );\n app.get('/api/admin', (c) => c.text('GET'));\n app.post('/api/admin', (c) => c.text('POST'));\n app.put('/api/admin', (c) => c.text('PUT'));\n app.delete('/api/admin', (c) => c.text('DELETE'));\n\n // All methods should be rejected\n const methods = ['GET', 'POST', 'PUT', 'DELETE'];\n for (const method of methods) {\n const res = await app.request('/api/admin', { method });\n expect(res.status).toBe(401);\n }\n\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(4);\n });\n\n it('should always allow OPTIONS requests', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/*' }], // protect all /api/* paths\n })\n );\n app.options('/api/test', (c) => c.text('OPTIONS OK'));\n\n const res = await app.request('/api/test', { method: 'OPTIONS' });\n expect(res.status).toBe(200);\n expect(await res.text()).toBe('OPTIONS OK');\n expect(auth.isAuthenticated).not.toHaveBeenCalled();\n });\n });\n\n describe('Path matching', () => {\n it('should support exact path matching', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/users' }],\n })\n );\n app.get('/api/users', (c) => c.text('Exact'));\n app.get('/api/users/123', (c) => c.text('With ID'));\n app.get('/api', (c) => c.text('Parent'));\n\n // Exact match path should be protected\n const exactRes = await app.request('/api/users');\n expect(exactRes.status).toBe(401);\n\n // Other paths should pass\n const idRes = await app.request('/api/users/123');\n expect(idRes.status).toBe(200);\n expect(await idRes.text()).toBe('With ID');\n\n const parentRes = await app.request('/api');\n expect(parentRes.status).toBe(200);\n expect(await parentRes.text()).toBe('Parent');\n });\n\n it('should support wildcard path matching', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/*' }, { path: '/admin/:id' }],\n })\n );\n app.get('/api/users', (c) => c.text('API Users'));\n app.get('/api/posts/123', (c) => c.text('API Post'));\n app.get('/admin/123', (c) => c.text('Admin'));\n app.get('/public', (c) => c.text('Public'));\n\n // All paths under /api/* should be protected\n const apiUsersRes = await app.request('/api/users');\n expect(apiUsersRes.status).toBe(401);\n\n const apiPostRes = await app.request('/api/posts/123');\n expect(apiPostRes.status).toBe(401);\n\n // /admin/:id should be protected\n const adminRes = await app.request('/admin/123');\n expect(adminRes.status).toBe(401);\n\n // /public should pass\n const publicRes = await app.request('/public');\n expect(publicRes.status).toBe(200);\n expect(await publicRes.text()).toBe('Public');\n });\n\n it('should support pattern-like path matching', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [\n { path: '/api/v1/*' },\n { path: '/api/v2/*' },\n { path: '/data.json' },\n { path: '/config.json' },\n ],\n })\n );\n app.get('/api/v1/users', (c) => c.text('V1'));\n app.get('/api/v2/users', (c) => c.text('V2'));\n app.get('/api/v3/users', (c) => c.text('V3'));\n app.get('/data.json', (c) => c.text('JSON'));\n app.get('/config.json', (c) => c.text('Config JSON'));\n app.get('/data.xml', (c) => c.text('XML'));\n\n // v1 and v2 should be protected\n const v1Res = await app.request('/api/v1/users');\n expect(v1Res.status).toBe(401);\n\n const v2Res = await app.request('/api/v2/users');\n expect(v2Res.status).toBe(401);\n\n // v3 should pass\n const v3Res = await app.request('/api/v3/users');\n expect(v3Res.status).toBe(200);\n\n // .json files should be protected\n const jsonRes = await app.request('/data.json');\n expect(jsonRes.status).toBe(401);\n\n const configJsonRes = await app.request('/config.json');\n expect(configJsonRes.status).toBe(401);\n\n // .xml files should pass\n const xmlRes = await app.request('/data.xml');\n expect(xmlRes.status).toBe(200);\n });\n });\n\n describe('Authentication function', () => {\n it('should pass Request object correctly to auth function', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockImplementation(async (request: Request) => {\n const authHeader = request.headers.get('Authorization');\n return authHeader === 'Bearer valid-token';\n }),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/protected' }],\n })\n );\n app.get('/protected', (c) => c.text('Protected'));\n\n // No token should fail\n const noTokenRes = await app.request('/protected');\n expect(noTokenRes.status).toBe(401);\n\n // Invalid token should fail\n const invalidTokenRes = await app.request('/protected', {\n headers: { Authorization: 'Bearer invalid-token' },\n });\n expect(invalidTokenRes.status).toBe(401);\n\n // Valid token should succeed\n const validTokenRes = await app.request('/protected', {\n headers: { Authorization: 'Bearer valid-token' },\n });\n expect(validTokenRes.status).toBe(200);\n expect(await validTokenRes.text()).toBe('Protected');\n\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(3);\n });\n\n it('should handle exceptions thrown by auth function', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockRejectedValue(new Error('Auth service error')),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/protected' }],\n })\n );\n app.get('/protected', (c) => c.text('Protected'));\n\n const res = await app.request('/protected');\n expect(res.status).toBe(500);\n // Error details are wrapped, just verify status\n });\n\n it('should support cookie-based authentication', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockImplementation(async (request: Request) => {\n const cookie = request.headers.get('Cookie');\n return cookie?.includes('session=valid-session');\n }),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/dashboard' }],\n })\n );\n app.get('/dashboard', (c) => c.text('Dashboard'));\n\n // No cookie should fail\n const noCookieRes = await app.request('/dashboard');\n expect(noCookieRes.status).toBe(401);\n\n // Valid cookie should succeed\n const validCookieRes = await app.request('/dashboard', {\n headers: { Cookie: 'session=valid-session; other=value' },\n });\n expect(validCookieRes.status).toBe(200);\n expect(await validCookieRes.text()).toBe('Dashboard');\n });\n\n it('should support query parameter authentication', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockImplementation(async (request: Request) => {\n const url = new URL(request.url);\n return url.searchParams.get('api_key') === 'valid-key';\n }),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/data' }],\n })\n );\n app.get('/api/data', (c) => c.text('Data'));\n\n // No API key should fail\n const noKeyRes = await app.request('/api/data');\n expect(noKeyRes.status).toBe(401);\n\n // Invalid API key should fail\n const invalidKeyRes = await app.request('/api/data?api_key=invalid-key');\n expect(invalidKeyRes.status).toBe(401);\n\n // Valid API key should succeed\n const validKeyRes = await app.request('/api/data?api_key=valid-key');\n expect(validKeyRes.status).toBe(200);\n expect(await validKeyRes.text()).toBe('Data');\n });\n });\n\n describe('Multiple rules', () => {\n it('should support multiple rule combinations', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [\n { path: '/api/users', methods: ['POST', 'PUT', 'DELETE'] },\n { path: '/api/admin/*' },\n { path: '/api/reports', methods: ['GET'] },\n { path: '/webhook/*', methods: ['POST'] },\n ],\n })\n );\n\n // Setup routes\n app.get('/api/users', (c) => c.text('GET users'));\n app.post('/api/users', (c) => c.text('POST users'));\n app.get('/api/admin/settings', (c) => c.text('Admin settings'));\n app.get('/api/reports', (c) => c.text('Reports'));\n app.post('/webhook/github', (c) => c.text('Webhook'));\n app.get('/public', (c) => c.text('Public'));\n\n // GET /api/users should pass (not protected)\n const getUsersRes = await app.request('/api/users');\n expect(getUsersRes.status).toBe(200);\n\n // POST /api/users should be rejected (protected)\n const postUsersRes = await app.request('/api/users', { method: 'POST' });\n expect(postUsersRes.status).toBe(401);\n\n // GET /api/admin/settings should be rejected (all methods protected)\n const adminRes = await app.request('/api/admin/settings');\n expect(adminRes.status).toBe(401);\n\n // GET /api/reports should be rejected (GET method protected)\n const reportsRes = await app.request('/api/reports');\n expect(reportsRes.status).toBe(401);\n\n // POST /webhook/github should be rejected (POST method protected)\n const webhookRes = await app.request('/webhook/github', { method: 'POST' });\n expect(webhookRes.status).toBe(401);\n\n // GET /public should pass (not protected)\n const publicRes = await app.request('/public');\n expect(publicRes.status).toBe(200);\n });\n\n it('should handle overlapping rules correctly', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(true),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [\n { path: '/api/*' }, // protect all /api/* paths\n { path: '/api/public', methods: ['GET'] }, // also protect GET /api/public\n ],\n })\n );\n app.get('/api/public', (c) => c.text('Public API'));\n app.post('/api/public', (c) => c.text('POST Public API'));\n\n // Both rules match, but auth passes, so should succeed\n const getRes = await app.request('/api/public');\n expect(getRes.status).toBe(200);\n\n const postRes = await app.request('/api/public', { method: 'POST' });\n expect(postRes.status).toBe(200);\n\n // Auth function should be called twice\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(2);\n });\n });\n\n describe('Edge cases', () => {\n it('should allow all requests with empty rules array', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(authorizer({ auth, rules: [] }));\n app.get('/any/path', (c) => c.text('OK'));\n\n const res = await app.request('/any/path');\n expect(res.status).toBe(200);\n expect(auth.isAuthenticated).not.toHaveBeenCalled();\n });\n\n it('should handle special characters in paths', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [\n { path: '/api/user@email.com' },\n { path: '/files/*.pdf' },\n { path: '/path-with-dash' },\n { path: '/path_with_underscore' },\n ],\n })\n );\n\n app.get('/api/user@email.com', (c) => c.text('Email'));\n app.get('/files/document.pdf', (c) => c.text('PDF'));\n app.get('/path-with-dash', (c) => c.text('Dash'));\n app.get('/path_with_underscore', (c) => c.text('Underscore'));\n\n // All special character paths should be matched and protected correctly\n const emailRes = await app.request('/api/user@email.com');\n expect(emailRes.status).toBe(401);\n\n const pdfRes = await app.request('/files/document.pdf');\n expect(pdfRes.status).toBe(401);\n\n const dashRes = await app.request('/path-with-dash');\n expect(dashRes.status).toBe(401);\n\n const underscoreRes = await app.request('/path_with_underscore');\n expect(underscoreRes.status).toBe(401);\n });\n\n it('should handle URLs with query parameters and fragments', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/search' }],\n })\n );\n app.get('/api/search', (c) => c.text('Search'));\n\n // Requests with query parameters should be matched correctly\n const res = await app.request('/api/search?q=test&page=1#results');\n expect(res.status).toBe(401);\n expect(auth.isAuthenticated).toHaveBeenCalledTimes(1);\n });\n\n it('should handle root path correctly', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/' }],\n })\n );\n app.get('/', (c) => c.text('Home'));\n app.get('/other', (c) => c.text('Other'));\n\n // Root path should be protected\n const rootRes = await app.request('/');\n expect(rootRes.status).toBe(401);\n\n // Other paths should pass\n const otherRes = await app.request('/other');\n expect(otherRes.status).toBe(200);\n });\n\n it('should handle trailing slashes as different paths', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockResolvedValue(false),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/api/users' }, { path: '/api/users/' }],\n })\n );\n app.get('/api/users', (c) => c.text('Users'));\n app.get('/api/users/', (c) => c.text('Users with slash'));\n\n // Both paths should be protected when explicitly defined\n const withoutSlash = await app.request('/api/users');\n expect(withoutSlash.status).toBe(401);\n\n const withSlash = await app.request('/api/users/');\n expect(withSlash.status).toBe(401);\n });\n });\n\n describe('Complex authentication scenarios', () => {\n it('should support role-based authentication', async () => {\n const auth: AuthorizerConfig['auth'] = {\n isAuthenticated: jest.fn().mockImplementation(async (request: Request) => {\n const authHeader = request.headers.get('Authorization');\n const url = new URL(request.url);\n\n // Admin endpoints require admin token\n if (url.pathname.startsWith('/admin')) {\n return authHeader === 'Bearer admin-token';\n }\n\n // Regular endpoints accept any valid token\n return authHeader?.startsWith('Bearer ');\n }),\n };\n\n app.use(\n authorizer({\n auth,\n rules: [{ path: '/admin/*' }, { path: '/api/*' }],\n })\n );\n\n app.get('/admin/users', (c) => c.text('Admin Users'));\n app.get('/api/data', (c) => c.text('API Data'));\n\n // Admin endpoint with regular token should fail\n const adminWithRegularToken = await app.request('/admin/users', {\n headers: { Authorization: 'Bearer user-token' },\n });\n expect(adminWithRegularToken.status).toBe(401);\n\n // Admin endpoint with admin token should succeed\n const adminWithAdminToken = await app.request('/admin/users', {\n headers: { Authorization: 'Bearer admin-token' },\n });\n expect(adminWithAdminToken.status).toBe(200);\n\n // API endpoint with any token should succeed\n const apiWithUserToken = await app.request('/api/data', {\n headers: { Authorization: 'Bearer user-token' },\n });\n expect(apiWithUserToken.status).toBe(200);\n });\n });\n});\n"],"mappings":"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","names":[]}