@passlock/node 2.0.1 → 2.0.2

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 (59) hide show
  1. package/dist/effect.d.ts +5 -5
  2. package/dist/effect.d.ts.map +1 -1
  3. package/dist/effect.js +2 -2
  4. package/dist/effect.js.map +1 -1
  5. package/dist/errors.d.ts +71 -0
  6. package/dist/errors.d.ts.map +1 -0
  7. package/dist/errors.js +25 -0
  8. package/dist/errors.js.map +1 -0
  9. package/dist/index.d.ts +63 -29
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +57 -24
  12. package/dist/index.js.map +1 -1
  13. package/dist/passkey/passkey.d.ts +116 -0
  14. package/dist/passkey/passkey.d.ts.map +1 -0
  15. package/dist/{passkey.js → passkey/passkey.js} +44 -20
  16. package/dist/passkey/passkey.js.map +1 -0
  17. package/dist/principal/principal.d.ts +22 -0
  18. package/dist/principal/principal.d.ts.map +1 -0
  19. package/dist/{principal.js → principal/principal.js} +9 -9
  20. package/dist/principal/principal.js.map +1 -0
  21. package/dist/safe.d.ts +136 -0
  22. package/dist/safe.d.ts.map +1 -0
  23. package/dist/safe.js +130 -0
  24. package/dist/safe.js.map +1 -0
  25. package/dist/schemas/errors.d.ts +13 -65
  26. package/dist/schemas/errors.d.ts.map +1 -1
  27. package/dist/schemas/errors.js +47 -6
  28. package/dist/schemas/errors.js.map +1 -1
  29. package/dist/schemas/passkey.d.ts +19 -21
  30. package/dist/schemas/passkey.d.ts.map +1 -1
  31. package/dist/schemas/passkey.js +23 -17
  32. package/dist/schemas/passkey.js.map +1 -1
  33. package/dist/schemas/principal.d.ts +46 -6
  34. package/dist/schemas/principal.d.ts.map +1 -1
  35. package/dist/schemas/principal.js +6 -6
  36. package/dist/schemas/principal.js.map +1 -1
  37. package/dist/schemas/satisfy.d.ts +2 -0
  38. package/dist/schemas/satisfy.d.ts.map +1 -0
  39. package/dist/schemas/satisfy.js +2 -0
  40. package/dist/schemas/satisfy.js.map +1 -0
  41. package/dist/shared.d.ts +3 -5
  42. package/dist/shared.d.ts.map +1 -1
  43. package/dist/shared.js +0 -3
  44. package/dist/shared.js.map +1 -1
  45. package/package.json +21 -18
  46. package/dist/passkey.d.ts +0 -24
  47. package/dist/passkey.d.ts.map +0 -1
  48. package/dist/passkey.js.map +0 -1
  49. package/dist/principal.d.ts +0 -18
  50. package/dist/principal.d.ts.map +0 -1
  51. package/dist/principal.js.map +0 -1
  52. package/dist/testUtils.d.ts +0 -11
  53. package/dist/testUtils.d.ts.map +0 -1
  54. package/dist/testUtils.js +0 -25
  55. package/dist/testUtils.js.map +0 -1
  56. package/dist/unsafe.d.ts +0 -55
  57. package/dist/unsafe.d.ts.map +0 -1
  58. package/dist/unsafe.js +0 -52
  59. package/dist/unsafe.js.map +0 -1
package/dist/effect.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- export type { AssignUserRequest, DeleteAuthenticatorOptions, GetAuthenticatorOptions, ListPasskeyOptions, } from "./passkey.js";
2
- export type { ExchangeCodeOptions, VerifyTokenOptions } from "./principal.js";
3
- export type { AuthenticatedTenancyOptions, TenancyOptions } from "./shared.js";
4
- export { assignUser, deletePasskey, getPasskey, listPasskeys, } from "./passkey.js";
5
- export { exchangeCode, VerificationFailure, verifyIdToken } from "./principal.js";
1
+ export type { AssignUserOptions as AssignUserRequest, ListPasskeyOptions, } from "./passkey/passkey.js";
2
+ export { assignUser, deletePasskey, getPasskey, listPasskeys, } from "./passkey/passkey.js";
3
+ export type {} from "./principal/principal.js";
4
+ export { exchangeCode, VerificationFailure, verifyIdToken, } from "./principal/principal.js";
6
5
  export * from "./schemas/index.js";
6
+ export type { AuthenticatedOptions, PasslockOptions, } from "./shared.js";
7
7
  //# sourceMappingURL=effect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAC7E,YAAY,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC9E,OAAO,EACL,UAAU,EACV,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACjF,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,IAAI,iBAAiB,EACtC,kBAAkB,GACnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,UAAU,EACV,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC9C,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,0BAA0B,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,YAAY,EACV,oBAAoB,EACpB,eAAe,GAChB,MAAM,aAAa,CAAA"}
package/dist/effect.js CHANGED
@@ -1,4 +1,4 @@
1
- export { assignUser, deletePasskey, getPasskey, listPasskeys, } from "./passkey.js";
2
- export { exchangeCode, VerificationFailure, verifyIdToken } from "./principal.js";
1
+ export { assignUser, deletePasskey, getPasskey, listPasskeys, } from "./passkey/passkey.js";
2
+ export { exchangeCode, VerificationFailure, verifyIdToken, } from "./principal/principal.js";
3
3
  export * from "./schemas/index.js";
4
4
  //# sourceMappingURL=effect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"effect.js","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,UAAU,EACV,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACjF,cAAc,oBAAoB,CAAA","sourcesContent":["export type {\n AssignUserRequest,\n DeleteAuthenticatorOptions,\n GetAuthenticatorOptions,\n ListPasskeyOptions,\n} from \"./passkey.js\"\nexport type { ExchangeCodeOptions, VerifyTokenOptions } from \"./principal.js\"\nexport type { AuthenticatedTenancyOptions, TenancyOptions } from \"./shared.js\"\nexport {\n assignUser,\n deletePasskey,\n getPasskey,\n listPasskeys,\n} from \"./passkey.js\"\nexport { exchangeCode, VerificationFailure, verifyIdToken } from \"./principal.js\"\nexport * from \"./schemas/index.js\"\n"]}
1
+ {"version":3,"file":"effect.js","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,UAAU,EACV,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,0BAA0B,CAAA;AACjC,cAAc,oBAAoB,CAAA","sourcesContent":["export type {\n AssignUserOptions as AssignUserRequest,\n ListPasskeyOptions,\n} from \"./passkey/passkey.js\"\nexport {\n assignUser,\n deletePasskey,\n getPasskey,\n listPasskeys,\n} from \"./passkey/passkey.js\"\nexport type {} from \"./principal/principal.js\"\nexport {\n exchangeCode,\n VerificationFailure,\n verifyIdToken,\n} from \"./principal/principal.js\"\nexport * from \"./schemas/index.js\"\nexport type {\n AuthenticatedOptions,\n PasslockOptions,\n} from \"./shared.js\"\n"]}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @category Authentication
3
+ */
4
+ export type Unauthorized = {
5
+ _tag: "@error/Unauthorized";
6
+ message: string;
7
+ };
8
+ export declare const isUnauthorized: (payload: unknown) => payload is Unauthorized;
9
+ /**
10
+ * @category Authentication
11
+ */
12
+ export type Forbidden = {
13
+ _tag: "@error/Forbidden";
14
+ message: string;
15
+ };
16
+ export declare const isForbidden: (payload: unknown) => payload is Forbidden;
17
+ /**
18
+ * @category Principal
19
+ */
20
+ export type InvalidCode = {
21
+ _tag: "@error/InvalidCode";
22
+ message: string;
23
+ };
24
+ export declare const isInvalidCode: (payload: unknown) => payload is InvalidCode;
25
+ /**
26
+ * @category Principal
27
+ */
28
+ export type VerificationFailure = {
29
+ _tag: "@error/VerificationFailure";
30
+ message: string;
31
+ };
32
+ export declare const isVerificationFailure: (payload: unknown) => payload is VerificationFailure;
33
+ export type InvalidTenancy = {
34
+ _tag: "@error/InvalidTenancy";
35
+ message: string;
36
+ };
37
+ export declare const isInvalidTenancy: (payload: unknown) => payload is InvalidTenancy;
38
+ /**
39
+ * Error payload returned when a passkey cannot be found for a given
40
+ * authentication attempt.
41
+ *
42
+ * @category Passkeys
43
+ */
44
+ export type PasskeyNotFound = {
45
+ _tag: "@error/PasskeyNotFound";
46
+ message: string;
47
+ credentialId: string;
48
+ rpId: string;
49
+ };
50
+ export declare const isPasskeyNotFound: (payload: unknown) => payload is PasskeyNotFound;
51
+ export type NotFound = {
52
+ _tag: "@error/NotFound";
53
+ message: string;
54
+ };
55
+ export declare const isNotFound: (payload: unknown) => payload is NotFound;
56
+ export type InvalidEmail = {
57
+ _tag: "@error/InvalidEmail";
58
+ message: string;
59
+ };
60
+ export declare const isInvalidEmail: (payload: unknown) => payload is InvalidEmail;
61
+ export type DuplicateEmail = {
62
+ _tag: "@error/DuplicateEmail";
63
+ message: string;
64
+ };
65
+ export declare const isDuplicateEmail: (payload: unknown) => payload is DuplicateEmail;
66
+ export type BadRequest = {
67
+ _tag: "@error/BadRequest";
68
+ message: string;
69
+ };
70
+ export declare const isBadRequest: (payload: unknown) => payload is BadRequest;
71
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,qBAAqB,CAAA;IAC3B,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,cAAc,YAnBf,OAAO,KAAG,OAAO,gBAmB8C,CAAA;AAI3E;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,kBAAkB,CAAA;IACxB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,WAAW,YA/BZ,OAAO,KAAG,OAAO,aA+BqC,CAAA;AAIlE;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,oBAAoB,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,aAAa,YA3Cd,OAAO,KAAG,OAAO,eA2C2C,CAAA;AAIxE;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,4BAA4B,CAAA;IAClC,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,qBAAqB,YAvDtB,OAAO,KAAG,OAAO,uBAyD5B,CAAA;AAID,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,uBAAuB,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,gBAAgB,YAlEjB,OAAO,KAAG,OAAO,kBAoE5B,CAAA;AAID;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,wBAAwB,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,eAAO,MAAM,iBAAiB,YArFlB,OAAO,KAAG,OAAO,mBAuF5B,CAAA;AAID,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,iBAAiB,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,UAAU,YAhGX,OAAO,KAAG,OAAO,YAgGkC,CAAA;AAI/D,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,qBAAqB,CAAA;IAC3B,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,cAAc,YAzGf,OAAO,KAAG,OAAO,gBAyG8C,CAAA;AAI3E,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,uBAAuB,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,gBAAgB,YAlHjB,OAAO,KAAG,OAAO,kBAoH5B,CAAA;AAID,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,mBAAmB,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,YAAY,YA7Hb,OAAO,KAAG,OAAO,cA6HwC,CAAA"}
package/dist/errors.js ADDED
@@ -0,0 +1,25 @@
1
+ /* Unauthorized */
2
+ const isTagged = (tag) => (payload) => {
3
+ if (typeof payload !== "object")
4
+ return false;
5
+ if (payload === null)
6
+ return false;
7
+ if (!("_tag" in payload))
8
+ return false;
9
+ if (typeof payload._tag !== "string")
10
+ return false;
11
+ if (payload._tag !== tag)
12
+ return false;
13
+ return true;
14
+ };
15
+ export const isUnauthorized = isTagged("@error/Unauthorized");
16
+ export const isForbidden = isTagged("@error/Forbidden");
17
+ export const isInvalidCode = isTagged("@error/InvalidCode");
18
+ export const isVerificationFailure = isTagged("@error/VerificationFailure");
19
+ export const isInvalidTenancy = isTagged("@error/InvalidTenancy");
20
+ export const isPasskeyNotFound = isTagged("@error/PasskeyNotFound");
21
+ export const isNotFound = isTagged("@error/NotFound");
22
+ export const isInvalidEmail = isTagged("@error/InvalidEmail");
23
+ export const isDuplicateEmail = isTagged("@error/DuplicateEmail");
24
+ export const isBadRequest = isTagged("@error/BadRequest");
25
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,MAAM,QAAQ,GACZ,CAA6B,GAAc,EAAE,EAAE,CAC/C,CAAC,OAAgB,EAAgB,EAAE;IACjC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC7C,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAElC,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC;QAAE,OAAO,KAAK,CAAA;IACtC,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAClD,IAAI,OAAO,CAAC,IAAI,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IAEtC,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAUH,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAe,qBAAqB,CAAC,CAAA;AAY3E,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAY,kBAAkB,CAAC,CAAA;AAYlE,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAc,oBAAoB,CAAC,CAAA;AAYxE,MAAM,CAAC,MAAM,qBAAqB,GAAG,QAAQ,CAC3C,4BAA4B,CAC7B,CAAA;AASD,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CACtC,uBAAuB,CACxB,CAAA;AAiBD,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CACvC,wBAAwB,CACzB,CAAA;AASD,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAW,iBAAiB,CAAC,CAAA;AAS/D,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAe,qBAAqB,CAAC,CAAA;AAS3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CACtC,uBAAuB,CACxB,CAAA;AASD,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAa,mBAAmB,CAAC,CAAA","sourcesContent":["/* Unauthorized */\n\nconst isTagged =\n <A extends { _tag: string }>(tag: A[\"_tag\"]) =>\n (payload: unknown): payload is A => {\n if (typeof payload !== \"object\") return false\n if (payload === null) return false\n\n if (!(\"_tag\" in payload)) return false\n if (typeof payload._tag !== \"string\") return false\n if (payload._tag !== tag) return false\n\n return true\n }\n\n/**\n * @category Authentication\n */\nexport type Unauthorized = {\n _tag: \"@error/Unauthorized\"\n message: string\n}\n\nexport const isUnauthorized = isTagged<Unauthorized>(\"@error/Unauthorized\")\n\n/* Forbidden */\n\n/**\n * @category Authentication\n */\nexport type Forbidden = {\n _tag: \"@error/Forbidden\"\n message: string\n}\n\nexport const isForbidden = isTagged<Forbidden>(\"@error/Forbidden\")\n\n/* InvalidCode */\n\n/**\n * @category Principal\n */\nexport type InvalidCode = {\n _tag: \"@error/InvalidCode\"\n message: string\n}\n\nexport const isInvalidCode = isTagged<InvalidCode>(\"@error/InvalidCode\")\n\n/* VerificationFailure */\n\n/**\n * @category Principal\n */\nexport type VerificationFailure = {\n _tag: \"@error/VerificationFailure\"\n message: string\n}\n\nexport const isVerificationFailure = isTagged<VerificationFailure>(\n \"@error/VerificationFailure\"\n)\n\n/* InvalidTenancy */\n\nexport type InvalidTenancy = {\n _tag: \"@error/InvalidTenancy\"\n message: string\n}\n\nexport const isInvalidTenancy = isTagged<InvalidTenancy>(\n \"@error/InvalidTenancy\"\n)\n\n/* PasskeyNotFound */\n\n/**\n * Error payload returned when a passkey cannot be found for a given\n * authentication attempt.\n *\n * @category Passkeys\n */\nexport type PasskeyNotFound = {\n _tag: \"@error/PasskeyNotFound\"\n message: string\n credentialId: string\n rpId: string\n}\n\nexport const isPasskeyNotFound = isTagged<PasskeyNotFound>(\n \"@error/PasskeyNotFound\"\n)\n\n/* NotFound */\n\nexport type NotFound = {\n _tag: \"@error/NotFound\"\n message: string\n}\n\nexport const isNotFound = isTagged<NotFound>(\"@error/NotFound\")\n\n/* InvalidEmail */\n\nexport type InvalidEmail = {\n _tag: \"@error/InvalidEmail\"\n message: string\n}\n\nexport const isInvalidEmail = isTagged<InvalidEmail>(\"@error/InvalidEmail\")\n\n/* DuplicateEmail */\n\nexport type DuplicateEmail = {\n _tag: \"@error/DuplicateEmail\"\n message: string\n}\n\nexport const isDuplicateEmail = isTagged<DuplicateEmail>(\n \"@error/DuplicateEmail\"\n)\n\n/* BadRequest */\n\nexport type BadRequest = {\n _tag: \"@error/BadRequest\"\n message: string\n}\n\nexport const isBadRequest = isTagged<BadRequest>(\"@error/BadRequest\")\n"]}
package/dist/index.d.ts CHANGED
@@ -1,56 +1,90 @@
1
- import type { AssignUserRequest, DeleteAuthenticatorOptions, GetAuthenticatorOptions, ListPasskeyOptions, Passkey } from "./passkey.js";
2
- import type { ExchangeCodeOptions, VerificationFailure, VerifyTokenOptions } from "./principal.js";
3
- import type { Forbidden, InvalidCode, NotFound } from "./schemas/errors.js";
4
- import type { DeletedPasskey, FindAllPasskeys } from "./schemas/passkey.js";
1
+ /**
2
+ * Unsafe functions that could potentially throw errors.
3
+ *
4
+ * @categoryDescription Passkeys
5
+ * Functions and related types for managing passkeys
6
+ *
7
+ * @showCategories
8
+ *
9
+ * @module unsafe
10
+ */
11
+ import type { AssignUserOptions, DeletedPasskey, DeletePasskeyOptions, FindAllPasskeys, GetPasskeyOptions, ListPasskeyOptions, Passkey, UpdatePasskeyOptions } from "./passkey/passkey.js";
12
+ import type { ExchangeCodeOptions, VerifyIdTokenOptions } from "./principal/principal.js";
5
13
  import type { ExtendedPrincipal, Principal } from "./schemas/principal.js";
6
14
  /**
7
15
  * Call the Passlock backend API to assign a userId to an authenticator
16
+ *
8
17
  * @param request
18
+ * @returns A promise resolving to the updated passkey.
19
+ * @throws {@link NotFound} if passkey does not exist
20
+ * @throws {@link Forbidden} if the Tenancy ID or API key is invalid
21
+ *
22
+ * @category Passkeys
23
+ */
24
+ export declare const assignUser: (request: AssignUserOptions) => Promise<Passkey>;
25
+ /**
26
+ * Call the Passlock backend API to update passkey properties
27
+ *
9
28
  * @param request
10
- * @returns
29
+ * @returns A promise resolving to the updated passkey.
30
+ *
31
+ * @category Passkeys
11
32
  */
12
- export declare const assignUser: (request: AssignUserRequest) => Promise<Passkey | NotFound | Forbidden>;
33
+ export declare const updatePasskey: (request: UpdatePasskeyOptions) => Promise<Passkey>;
13
34
  /**
14
35
  * Call the Passlock backend API to delete an authenticator
36
+ *
15
37
  * @param options
16
- * @param options
17
- * @returns
38
+ * @returns A promise resolving to the deleted passkey payload.
39
+ *
40
+ * @category Passkeys
18
41
  */
19
- export declare const deletePasskey: (passkeyId: string, options: DeleteAuthenticatorOptions) => Promise<DeletedPasskey | Forbidden | NotFound>;
42
+ export declare const deletePasskey: (options: DeletePasskeyOptions) => Promise<DeletedPasskey>;
20
43
  /**
21
44
  * Call the Passlock backend API to fetch an authenticator
22
- * @param request
23
- * @param request
24
- * @returns
45
+ * @param options
46
+ * @returns A promise resolving to the passkey.
25
47
  */
26
- export declare const getPasskey: (authenticatorId: string, options: GetAuthenticatorOptions) => Promise<Passkey | Forbidden | NotFound>;
48
+ export declare const getPasskey: (options: GetPasskeyOptions) => Promise<Passkey>;
27
49
  /**
28
- * List passkeys for the given tenancy. Note this could return a cursor, in which case the function chould be called with the given cursor.
50
+ * List passkeys for the given tenancy. Note this could return a cursor,
51
+ * in which case the function should be called again with the given cursor.
52
+ *
29
53
  * @param options
30
- * @returns
54
+ * @returns A promise resolving to a page of passkey summaries.
55
+ *
56
+ * @category Passkeys
31
57
  */
32
- export declare const listPasskeys: (options: ListPasskeyOptions) => Promise<FindAllPasskeys | Forbidden>;
58
+ export declare const listPasskeys: (options: ListPasskeyOptions) => Promise<FindAllPasskeys>;
33
59
  /**
34
60
  * Call the Passlock backend API to exchange a code for a Principal
35
- * @param code
36
- * @package options
37
- * @returns
61
+ *
62
+ * @param options
63
+ * @returns A promise resolving to an extended principal.
64
+ *
65
+ * @category Principal
38
66
  */
39
- export declare const exchangeCode: (code: string, options: ExchangeCodeOptions) => Promise<ExtendedPrincipal | Forbidden | InvalidCode>;
67
+ export declare const exchangeCode: (options: ExchangeCodeOptions) => Promise<ExtendedPrincipal>;
40
68
  /**
41
69
  * Decode and verify a Passlock idToken.
42
70
  * Note: This will make a network call to the passlock.dev/.well-known/jwks.json
43
71
  * endpoint to fetch the relevant public key. The response will be cached, however
44
72
  * bear in mind that for something like AWS lambda it will make the call on every
45
73
  * cold start so might actually be slower than {@link exchangeCode}
46
- * @param token
74
+ *
47
75
  * @param options
48
- * @returns
49
- */
50
- export declare const verifyIdToken: (token: string, options: VerifyTokenOptions) => Promise<Principal | VerificationFailure>;
51
- export type { AssignUserRequest, DeleteAuthenticatorOptions, GetAuthenticatorOptions, ListPasskeyOptions, } from "./passkey.js";
52
- export type { ExchangeCodeOptions, VerifyTokenOptions } from "./principal.js";
53
- export type { AuthenticatedTenancyOptions, TenancyOptions } from "./shared.js";
54
- export { VerificationFailure } from "./principal.js";
55
- export * from "./schemas/index.js";
76
+ * @returns A promise resolving to the verified principal.
77
+ *
78
+ * @category Principal
79
+ */
80
+ export declare const verifyIdToken: (options: VerifyIdTokenOptions) => Promise<Principal>;
81
+ export type { BadRequest, DuplicateEmail, Forbidden, InvalidCode, InvalidEmail, InvalidTenancy, NotFound, PasskeyNotFound, Unauthorized, VerificationFailure, } from "./errors.js";
82
+ export { isBadRequest, isDuplicateEmail, isForbidden, isInvalidCode, isInvalidEmail, isInvalidTenancy, isNotFound, isPasskeyNotFound, isUnauthorized, isVerificationFailure, } from "./errors.js";
83
+ export type { AssignUserOptions, Credential, DeletedPasskey, DeletePasskeyOptions, FindAllPasskeys, GetPasskeyOptions, ListPasskeyOptions, Passkey, PasskeySummary, Platform, UpdatePasskeyOptions, } from "./passkey/passkey.js";
84
+ export { isDeletedPasskey, isPasskey, isPasskeySummary, } from "./passkey/passkey.js";
85
+ export type { ExchangeCodeOptions, VerifyIdTokenOptions, } from "./principal/principal.js";
86
+ export type { CredentialDeviceType, Transports, } from "./schemas/passkey.js";
87
+ export type { ExtendedPrincipal, Principal } from "./schemas/principal.js";
88
+ export { isExtendedPrincipal, isPrincipal } from "./schemas/principal.js";
89
+ export type { AuthenticatedOptions, PasslockOptions, } from "./shared.js";
56
90
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,uBAAuB,EACvB,kBAAkB,EAClB,OAAO,EACR,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAClG,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAW1E;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,SAAS,iBAAiB,KAAG,OAAO,CAAC,OAAO,GAAG,QAAQ,GAAG,SAAS,CAK3F,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GACxB,WAAW,MAAM,EACjB,SAAS,0BAA0B,KAClC,OAAO,CAAC,cAAc,GAAG,SAAS,GAAG,QAAQ,CAK7C,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GACrB,iBAAiB,MAAM,EACvB,SAAS,uBAAuB,KAC/B,OAAO,CAAC,OAAO,GAAG,SAAS,GAAG,QAAQ,CAKtC,CAAA;AAEH;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,kBAAkB,KAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAK3F,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,MAAM,EACZ,SAAS,mBAAmB,KAC3B,OAAO,CAAC,iBAAiB,GAAG,SAAS,GAAG,WAAW,CAMnD,CAAA;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,EACb,SAAS,kBAAkB,KAC1B,OAAO,CAAC,SAAS,GAAG,mBAAmB,CAKvC,CAAA;AAEH,YAAY,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAC7E,YAAY,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACpD,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,OAAO,EACP,oBAAoB,EACrB,MAAM,sBAAsB,CAAA;AAQ7B,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,0BAA0B,CAAA;AAKjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAE1E;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GAAI,SAAS,iBAAiB,KAAG,OAAO,CAAC,OAAO,CACxB,CAAA;AAE/C;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,oBAAoB,KAC5B,OAAO,CAAC,OAAO,CAAqD,CAAA;AAEvE;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,oBAAoB,KAC5B,OAAO,CAAC,cAAc,CAAqD,CAAA;AAE9E;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,SAAS,iBAAiB,KAAG,OAAO,CAAC,OAAO,CACxB,CAAA;AAE/C;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GACvB,SAAS,kBAAkB,KAC1B,OAAO,CAAC,eAAe,CAAoD,CAAA;AAE9E;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GACvB,SAAS,mBAAmB,KAC3B,OAAO,CAAC,iBAAiB,CAKzB,CAAA;AAEH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,oBAAoB,KAC5B,OAAO,CAAC,SAAS,CAKjB,CAAA;AAIH,YAAY,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,WAAW,EACX,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,mBAAmB,GACpB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,qBAAqB,GACtB,MAAM,aAAa,CAAA;AACpB,YAAY,EACV,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,OAAO,EACP,cAAc,EACd,QAAQ,EACR,oBAAoB,GACrB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EACV,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EACV,oBAAoB,EACpB,UAAU,GACX,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAC1E,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzE,YAAY,EACV,oBAAoB,EACpB,eAAe,GAChB,MAAM,aAAa,CAAA"}
package/dist/index.js CHANGED
@@ -1,52 +1,85 @@
1
+ /**
2
+ * Unsafe functions that could potentially throw errors.
3
+ *
4
+ * @categoryDescription Passkeys
5
+ * Functions and related types for managing passkeys
6
+ *
7
+ * @showCategories
8
+ *
9
+ * @module unsafe
10
+ */
1
11
  import { FetchHttpClient } from "@effect/platform";
2
- import { Effect, identity, pipe } from "effect";
3
- import { assignUser as assignUserE, deletePasskey as deletePasskeyE, getPasskey as getPasskeyE, listPasskeys as listPasskeysE, } from "./passkey.js";
4
- import { exchangeCode as exchangeCodeE, verifyIdToken as verifyIdTokenE } from "./principal.js";
12
+ import { Effect, pipe } from "effect";
13
+ import { assignUser as assignUserE, deletePasskey as deletePasskeyE, getPasskey as getPasskeyE, listPasskeys as listPasskeysE, updatePasskey as updatePasskeyE, } from "./passkey/passkey.js";
14
+ import { exchangeCode as exchangeCodeE, verifyIdToken as verifyIdTokenE, } from "./principal/principal.js";
5
15
  /**
6
16
  * Call the Passlock backend API to assign a userId to an authenticator
17
+ *
7
18
  * @param request
19
+ * @returns A promise resolving to the updated passkey.
20
+ * @throws {@link NotFound} if passkey does not exist
21
+ * @throws {@link Forbidden} if the Tenancy ID or API key is invalid
22
+ *
23
+ * @category Passkeys
24
+ */
25
+ export const assignUser = (request) => pipe(assignUserE(request), Effect.runPromise);
26
+ /**
27
+ * Call the Passlock backend API to update passkey properties
28
+ *
8
29
  * @param request
9
- * @returns
30
+ * @returns A promise resolving to the updated passkey.
31
+ *
32
+ * @category Passkeys
10
33
  */
11
- export const assignUser = (request) => pipe(assignUserE(request), Effect.match({ onFailure: identity, onSuccess: identity }), Effect.runPromise);
34
+ export const updatePasskey = (request) => pipe(updatePasskeyE(request), Effect.runPromise);
12
35
  /**
13
36
  * Call the Passlock backend API to delete an authenticator
37
+ *
14
38
  * @param options
15
- * @param options
16
- * @returns
39
+ * @returns A promise resolving to the deleted passkey payload.
40
+ *
41
+ * @category Passkeys
17
42
  */
18
- export const deletePasskey = (passkeyId, options) => pipe(deletePasskeyE(passkeyId, options), Effect.match({ onFailure: identity, onSuccess: identity }), Effect.runPromise);
43
+ export const deletePasskey = (options) => pipe(deletePasskeyE(options), Effect.runPromise);
19
44
  /**
20
45
  * Call the Passlock backend API to fetch an authenticator
21
- * @param request
22
- * @param request
23
- * @returns
46
+ * @param options
47
+ * @returns A promise resolving to the passkey.
24
48
  */
25
- export const getPasskey = (authenticatorId, options) => pipe(getPasskeyE(authenticatorId, options), Effect.match({ onFailure: identity, onSuccess: identity }), Effect.runPromise);
49
+ export const getPasskey = (options) => pipe(getPasskeyE(options), Effect.runPromise);
26
50
  /**
27
- * List passkeys for the given tenancy. Note this could return a cursor, in which case the function chould be called with the given cursor.
51
+ * List passkeys for the given tenancy. Note this could return a cursor,
52
+ * in which case the function should be called again with the given cursor.
53
+ *
28
54
  * @param options
29
- * @returns
55
+ * @returns A promise resolving to a page of passkey summaries.
56
+ *
57
+ * @category Passkeys
30
58
  */
31
- export const listPasskeys = (options) => pipe(listPasskeysE(options), Effect.match({ onFailure: identity, onSuccess: identity }), Effect.runPromise);
59
+ export const listPasskeys = (options) => pipe(listPasskeysE(options), Effect.runPromise);
32
60
  /**
33
61
  * Call the Passlock backend API to exchange a code for a Principal
34
- * @param code
35
- * @package options
36
- * @returns
62
+ *
63
+ * @param options
64
+ * @returns A promise resolving to an extended principal.
65
+ *
66
+ * @category Principal
37
67
  */
38
- export const exchangeCode = (code, options) => pipe(exchangeCodeE(code, options), Effect.match({ onFailure: identity, onSuccess: identity }), Effect.provide(FetchHttpClient.layer), Effect.runPromise);
68
+ export const exchangeCode = (options) => pipe(exchangeCodeE(options), Effect.provide(FetchHttpClient.layer), Effect.runPromise);
39
69
  /**
40
70
  * Decode and verify a Passlock idToken.
41
71
  * Note: This will make a network call to the passlock.dev/.well-known/jwks.json
42
72
  * endpoint to fetch the relevant public key. The response will be cached, however
43
73
  * bear in mind that for something like AWS lambda it will make the call on every
44
74
  * cold start so might actually be slower than {@link exchangeCode}
45
- * @param token
75
+ *
46
76
  * @param options
47
- * @returns
77
+ * @returns A promise resolving to the verified principal.
78
+ *
79
+ * @category Principal
48
80
  */
49
- export const verifyIdToken = (token, options) => pipe(verifyIdTokenE(token, options), Effect.match({ onFailure: identity, onSuccess: identity }), Effect.runPromise);
50
- export { VerificationFailure } from "./principal.js";
51
- export * from "./schemas/index.js";
81
+ export const verifyIdToken = (options) => pipe(verifyIdTokenE(options), Effect.provide(FetchHttpClient.layer), Effect.runPromise);
82
+ export { isBadRequest, isDuplicateEmail, isForbidden, isInvalidCode, isInvalidEmail, isInvalidTenancy, isNotFound, isPasskeyNotFound, isUnauthorized, isVerificationFailure, } from "./errors.js";
83
+ export { isDeletedPasskey, isPasskey, isPasskeySummary, } from "./passkey/passkey.js";
84
+ export { isExtendedPrincipal, isPrincipal } from "./schemas/principal.js";
52
85
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EACL,UAAU,IAAI,WAAW,EACzB,aAAa,IAAI,cAAc,EAC/B,UAAU,IAAI,WAAW,EACzB,YAAY,IAAI,aAAa,GAC9B,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/F;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAA0B,EAA2C,EAAE,CAChG,IAAI,CACF,WAAW,CAAC,OAAO,CAAC,EACpB,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAC1D,MAAM,CAAC,UAAU,CAClB,CAAA;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,SAAiB,EACjB,OAAmC,EACa,EAAE,CAClD,IAAI,CACF,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,EAClC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAC1D,MAAM,CAAC,UAAU,CAClB,CAAA;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,eAAuB,EACvB,OAAgC,EACS,EAAE,CAC3C,IAAI,CACF,WAAW,CAAC,eAAe,EAAE,OAAO,CAAC,EACrC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAC1D,MAAM,CAAC,UAAU,CAClB,CAAA;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAA2B,EAAwC,EAAE,CAChG,IAAI,CACF,aAAa,CAAC,OAAO,CAAC,EACtB,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAC1D,MAAM,CAAC,UAAU,CAClB,CAAA;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,IAAY,EACZ,OAA4B,EAC0B,EAAE,CACxD,IAAI,CACF,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,EAC5B,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAC1D,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,EACrC,MAAM,CAAC,UAAU,CAClB,CAAA;AAEH;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAAa,EACb,OAA2B,EACe,EAAE,CAC5C,IAAI,CACF,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,EAC9B,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAC1D,MAAM,CAAC,UAAU,CAClB,CAAA;AAUH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACpD,cAAc,oBAAoB,CAAA","sourcesContent":["import type {\n AssignUserRequest,\n DeleteAuthenticatorOptions,\n GetAuthenticatorOptions,\n ListPasskeyOptions,\n Passkey,\n} from \"./passkey.js\"\nimport type { ExchangeCodeOptions, VerificationFailure, VerifyTokenOptions } from \"./principal.js\"\nimport type { Forbidden, InvalidCode, NotFound } from \"./schemas/errors.js\"\nimport type { DeletedPasskey, FindAllPasskeys } from \"./schemas/passkey.js\"\nimport type { ExtendedPrincipal, Principal } from \"./schemas/principal.js\"\nimport { FetchHttpClient } from \"@effect/platform\"\nimport { Effect, identity, pipe } from \"effect\"\nimport {\n assignUser as assignUserE,\n deletePasskey as deletePasskeyE,\n getPasskey as getPasskeyE,\n listPasskeys as listPasskeysE,\n} from \"./passkey.js\"\nimport { exchangeCode as exchangeCodeE, verifyIdToken as verifyIdTokenE } from \"./principal.js\"\n\n/**\n * Call the Passlock backend API to assign a userId to an authenticator\n * @param request\n * @param request\n * @returns\n */\nexport const assignUser = (request: AssignUserRequest): Promise<Passkey | NotFound | Forbidden> =>\n pipe(\n assignUserE(request),\n Effect.match({ onFailure: identity, onSuccess: identity }),\n Effect.runPromise\n )\n\n/**\n * Call the Passlock backend API to delete an authenticator\n * @param options\n * @param options\n * @returns\n */\nexport const deletePasskey = (\n passkeyId: string,\n options: DeleteAuthenticatorOptions\n): Promise<DeletedPasskey | Forbidden | NotFound> =>\n pipe(\n deletePasskeyE(passkeyId, options),\n Effect.match({ onFailure: identity, onSuccess: identity }),\n Effect.runPromise\n )\n\n/**\n * Call the Passlock backend API to fetch an authenticator\n * @param request\n * @param request\n * @returns\n */\nexport const getPasskey = (\n authenticatorId: string,\n options: GetAuthenticatorOptions\n): Promise<Passkey | Forbidden | NotFound> =>\n pipe(\n getPasskeyE(authenticatorId, options),\n Effect.match({ onFailure: identity, onSuccess: identity }),\n Effect.runPromise\n )\n\n/**\n * List passkeys for the given tenancy. Note this could return a cursor, in which case the function chould be called with the given cursor.\n * @param options\n * @returns\n */\nexport const listPasskeys = (options: ListPasskeyOptions): Promise<FindAllPasskeys | Forbidden> =>\n pipe(\n listPasskeysE(options),\n Effect.match({ onFailure: identity, onSuccess: identity }),\n Effect.runPromise\n )\n\n/**\n * Call the Passlock backend API to exchange a code for a Principal\n * @param code\n * @package options\n * @returns\n */\nexport const exchangeCode = (\n code: string,\n options: ExchangeCodeOptions\n): Promise<ExtendedPrincipal | Forbidden | InvalidCode> =>\n pipe(\n exchangeCodeE(code, options),\n Effect.match({ onFailure: identity, onSuccess: identity }),\n Effect.provide(FetchHttpClient.layer),\n Effect.runPromise\n )\n\n/**\n * Decode and verify a Passlock idToken.\n * Note: This will make a network call to the passlock.dev/.well-known/jwks.json\n * endpoint to fetch the relevant public key. The response will be cached, however\n * bear in mind that for something like AWS lambda it will make the call on every\n * cold start so might actually be slower than {@link exchangeCode}\n * @param token\n * @param options\n * @returns\n */\nexport const verifyIdToken = (\n token: string,\n options: VerifyTokenOptions\n): Promise<Principal | VerificationFailure> =>\n pipe(\n verifyIdTokenE(token, options),\n Effect.match({ onFailure: identity, onSuccess: identity }),\n Effect.runPromise\n )\n\nexport type {\n AssignUserRequest,\n DeleteAuthenticatorOptions,\n GetAuthenticatorOptions,\n ListPasskeyOptions,\n} from \"./passkey.js\"\nexport type { ExchangeCodeOptions, VerifyTokenOptions } from \"./principal.js\"\nexport type { AuthenticatedTenancyOptions, TenancyOptions } from \"./shared.js\"\nexport { VerificationFailure } from \"./principal.js\"\nexport * from \"./schemas/index.js\"\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAWrC,OAAO,EACL,UAAU,IAAI,WAAW,EACzB,aAAa,IAAI,cAAc,EAC/B,UAAU,IAAI,WAAW,EACzB,YAAY,IAAI,aAAa,EAC7B,aAAa,IAAI,cAAc,GAChC,MAAM,sBAAsB,CAAA;AAK7B,OAAO,EACL,YAAY,IAAI,aAAa,EAC7B,aAAa,IAAI,cAAc,GAChC,MAAM,0BAA0B,CAAA;AAGjC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAA0B,EAAoB,EAAE,CACzE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAE/C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAA6B,EACX,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAEvE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAA6B,EACJ,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAA0B,EAAoB,EAAE,CACzE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAE/C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAA2B,EACD,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAA4B,EACA,EAAE,CAC9B,IAAI,CACF,aAAa,CAAC,OAAO,CAAC,EACtB,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,EACrC,MAAM,CAAC,UAAU,CAClB,CAAA;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAA6B,EACT,EAAE,CACtB,IAAI,CACF,cAAc,CAAC,OAAO,CAAC,EACvB,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,EACrC,MAAM,CAAC,UAAU,CAClB,CAAA;AAgBH,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,qBAAqB,GACtB,MAAM,aAAa,CAAA;AAcpB,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAU7B,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA","sourcesContent":["/**\n * Unsafe functions that could potentially throw errors.\n *\n * @categoryDescription Passkeys\n * Functions and related types for managing passkeys\n *\n * @showCategories\n *\n * @module unsafe\n */\n\nimport { FetchHttpClient } from \"@effect/platform\"\nimport { Effect, pipe } from \"effect\"\nimport type {\n AssignUserOptions,\n DeletedPasskey,\n DeletePasskeyOptions,\n FindAllPasskeys,\n GetPasskeyOptions,\n ListPasskeyOptions,\n Passkey,\n UpdatePasskeyOptions,\n} from \"./passkey/passkey.js\"\nimport {\n assignUser as assignUserE,\n deletePasskey as deletePasskeyE,\n getPasskey as getPasskeyE,\n listPasskeys as listPasskeysE,\n updatePasskey as updatePasskeyE,\n} from \"./passkey/passkey.js\"\nimport type {\n ExchangeCodeOptions,\n VerifyIdTokenOptions,\n} from \"./principal/principal.js\"\nimport {\n exchangeCode as exchangeCodeE,\n verifyIdToken as verifyIdTokenE,\n} from \"./principal/principal.js\"\nimport type { ExtendedPrincipal, Principal } from \"./schemas/principal.js\"\n\n/**\n * Call the Passlock backend API to assign a userId to an authenticator\n *\n * @param request\n * @returns A promise resolving to the updated passkey.\n * @throws {@link NotFound} if passkey does not exist\n * @throws {@link Forbidden} if the Tenancy ID or API key is invalid\n *\n * @category Passkeys\n */\nexport const assignUser = (request: AssignUserOptions): Promise<Passkey> =>\n pipe(assignUserE(request), Effect.runPromise)\n\n/**\n * Call the Passlock backend API to update passkey properties\n *\n * @param request\n * @returns A promise resolving to the updated passkey.\n *\n * @category Passkeys\n */\nexport const updatePasskey = (\n request: UpdatePasskeyOptions\n): Promise<Passkey> => pipe(updatePasskeyE(request), Effect.runPromise)\n\n/**\n * Call the Passlock backend API to delete an authenticator\n *\n * @param options\n * @returns A promise resolving to the deleted passkey payload.\n *\n * @category Passkeys\n */\nexport const deletePasskey = (\n options: DeletePasskeyOptions\n): Promise<DeletedPasskey> => pipe(deletePasskeyE(options), Effect.runPromise)\n\n/**\n * Call the Passlock backend API to fetch an authenticator\n * @param options\n * @returns A promise resolving to the passkey.\n */\nexport const getPasskey = (options: GetPasskeyOptions): Promise<Passkey> =>\n pipe(getPasskeyE(options), Effect.runPromise)\n\n/**\n * List passkeys for the given tenancy. Note this could return a cursor,\n * in which case the function should be called again with the given cursor.\n *\n * @param options\n * @returns A promise resolving to a page of passkey summaries.\n *\n * @category Passkeys\n */\nexport const listPasskeys = (\n options: ListPasskeyOptions\n): Promise<FindAllPasskeys> => pipe(listPasskeysE(options), Effect.runPromise)\n\n/**\n * Call the Passlock backend API to exchange a code for a Principal\n *\n * @param options\n * @returns A promise resolving to an extended principal.\n *\n * @category Principal\n */\nexport const exchangeCode = (\n options: ExchangeCodeOptions\n): Promise<ExtendedPrincipal> =>\n pipe(\n exchangeCodeE(options),\n Effect.provide(FetchHttpClient.layer),\n Effect.runPromise\n )\n\n/**\n * Decode and verify a Passlock idToken.\n * Note: This will make a network call to the passlock.dev/.well-known/jwks.json\n * endpoint to fetch the relevant public key. The response will be cached, however\n * bear in mind that for something like AWS lambda it will make the call on every\n * cold start so might actually be slower than {@link exchangeCode}\n *\n * @param options\n * @returns A promise resolving to the verified principal.\n *\n * @category Principal\n */\nexport const verifyIdToken = (\n options: VerifyIdTokenOptions\n): Promise<Principal> =>\n pipe(\n verifyIdTokenE(options),\n Effect.provide(FetchHttpClient.layer),\n Effect.runPromise\n )\n\n/* Re-exports */\n\nexport type {\n BadRequest,\n DuplicateEmail,\n Forbidden,\n InvalidCode,\n InvalidEmail,\n InvalidTenancy,\n NotFound,\n PasskeyNotFound,\n Unauthorized,\n VerificationFailure,\n} from \"./errors.js\"\nexport {\n isBadRequest,\n isDuplicateEmail,\n isForbidden,\n isInvalidCode,\n isInvalidEmail,\n isInvalidTenancy,\n isNotFound,\n isPasskeyNotFound,\n isUnauthorized,\n isVerificationFailure,\n} from \"./errors.js\"\nexport type {\n AssignUserOptions,\n Credential,\n DeletedPasskey,\n DeletePasskeyOptions,\n FindAllPasskeys,\n GetPasskeyOptions,\n ListPasskeyOptions,\n Passkey,\n PasskeySummary,\n Platform,\n UpdatePasskeyOptions,\n} from \"./passkey/passkey.js\"\nexport {\n isDeletedPasskey,\n isPasskey,\n isPasskeySummary,\n} from \"./passkey/passkey.js\"\nexport type {\n ExchangeCodeOptions,\n VerifyIdTokenOptions,\n} from \"./principal/principal.js\"\nexport type {\n CredentialDeviceType,\n Transports,\n} from \"./schemas/passkey.js\"\nexport type { ExtendedPrincipal, Principal } from \"./schemas/principal.js\"\nexport { isExtendedPrincipal, isPrincipal } from \"./schemas/principal.js\"\nexport type {\n AuthenticatedOptions,\n PasslockOptions,\n} from \"./shared.js\"\n"]}
@@ -0,0 +1,116 @@
1
+ import { HttpClient } from "@effect/platform";
2
+ import { Effect, type Layer, Stream } from "effect";
3
+ import { Forbidden, NotFound } from "../schemas/index.js";
4
+ import { type CredentialDeviceType, type Transports } from "../schemas/passkey.js";
5
+ import type { AuthenticatedOptions } from "../shared.js";
6
+ /**
7
+ * WebAuthn specific passkey data
8
+ */
9
+ export type Credential = {
10
+ id: string;
11
+ userId: string;
12
+ username: string;
13
+ aaguid: string;
14
+ backedUp: boolean;
15
+ counter: number;
16
+ deviceType: CredentialDeviceType;
17
+ transports: ReadonlyArray<Transports>;
18
+ publicKey: Uint8Array<ArrayBufferLike>;
19
+ };
20
+ /**
21
+ * Passkeys are usually synced across devices **but only within
22
+ * a specific platform/ecosystem** e.g. a passkey created on Apple
23
+ * devices would typically be synced across devices sharing the same
24
+ * iCloud ID.
25
+ *
26
+ * However, if the user also wants to sign in from their Windows
27
+ * or Android/Chrome devices they will need an additional passkey.
28
+ * Therefore when listing the passkeys registered to a user's account
29
+ * it's a good idea to tell them which platform the passkeys relate to.
30
+ *
31
+ * We've also included links to icons (SVG) so you can give your users
32
+ * a quick visual indication.
33
+ */
34
+ export type Platform = {
35
+ name?: string | undefined;
36
+ icon?: string | undefined;
37
+ };
38
+ /**
39
+ * The server-side component of a passkey
40
+ *
41
+ * @category Passkeys
42
+ */
43
+ export type Passkey = {
44
+ _tag: "Passkey";
45
+ /**
46
+ * Not to be confused with the credential.id
47
+ */
48
+ id: string;
49
+ /**
50
+ * Not to be confused with the credential.userId
51
+ */
52
+ userId?: string | undefined;
53
+ enabled: boolean;
54
+ credential: Credential;
55
+ platform?: Platform | undefined;
56
+ lastUsed?: number | undefined;
57
+ createdAt: number;
58
+ updatedAt: number;
59
+ };
60
+ export declare const isPasskey: (payload: unknown) => payload is Passkey;
61
+ export type PasskeySummary = {
62
+ readonly _tag: "PasskeySummary";
63
+ readonly id: string;
64
+ readonly userId: string;
65
+ readonly enabled: boolean;
66
+ readonly credential: {
67
+ readonly id: string;
68
+ readonly userId: string;
69
+ };
70
+ readonly lastUsed?: number | undefined;
71
+ readonly createdAt: number;
72
+ };
73
+ export declare const isPasskeySummary: (payload: unknown) => payload is PasskeySummary;
74
+ export type FindAllPasskeys = {
75
+ readonly _tag: "FindAllPasskeys";
76
+ readonly cursor: string | null;
77
+ readonly records: ReadonlyArray<PasskeySummary>;
78
+ };
79
+ export type DeletedPasskey = {
80
+ readonly _tag: "DeletedPasskey";
81
+ readonly id: string;
82
+ readonly credentialId: string;
83
+ readonly rpId: string;
84
+ };
85
+ export declare const isDeletedPasskey: (payload: unknown) => payload is DeletedPasskey;
86
+ export interface GetPasskeyOptions extends AuthenticatedOptions {
87
+ passkeyId: string;
88
+ }
89
+ export declare const getPasskey: (options: GetPasskeyOptions, httpClient?: Layer.Layer<HttpClient.HttpClient>) => Effect.Effect<Passkey, NotFound | Forbidden>;
90
+ export interface DeletePasskeyOptions extends AuthenticatedOptions {
91
+ passkeyId: string;
92
+ }
93
+ export declare const deletePasskey: (options: DeletePasskeyOptions, httpClient?: Layer.Layer<HttpClient.HttpClient>) => Effect.Effect<DeletedPasskey, NotFound | Forbidden>;
94
+ /**
95
+ * @category Passkeys
96
+ */
97
+ export interface AssignUserOptions extends AuthenticatedOptions {
98
+ passkeyId: string;
99
+ /**
100
+ * Custom User ID to align with your own systems
101
+ */
102
+ userId: string;
103
+ }
104
+ export declare const assignUser: (options: AssignUserOptions, httpClient?: Layer.Layer<HttpClient.HttpClient>) => Effect.Effect<Passkey, NotFound | Forbidden>;
105
+ export interface UpdatePasskeyOptions extends AuthenticatedOptions {
106
+ passkeyId: string;
107
+ userId?: string;
108
+ username?: string;
109
+ }
110
+ export declare const updatePasskey: (options: UpdatePasskeyOptions, httpClient?: Layer.Layer<HttpClient.HttpClient>) => Effect.Effect<Passkey, NotFound | Forbidden>;
111
+ export declare const listPasskeysStream: (options: AuthenticatedOptions, httpClient?: Layer.Layer<HttpClient.HttpClient>) => Stream.Stream<PasskeySummary, Forbidden>;
112
+ export interface ListPasskeyOptions extends AuthenticatedOptions {
113
+ cursor?: string;
114
+ }
115
+ export declare const listPasskeys: (options: ListPasskeyOptions, httpClient?: Layer.Layer<HttpClient.HttpClient>) => Effect.Effect<FindAllPasskeys, Forbidden>;
116
+ //# sourceMappingURL=passkey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passkey.d.ts","sourceRoot":"","sources":["../../src/passkey/passkey.ts"],"names":[],"mappings":"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"}